关键技术剖析

1.java.lang.reflect包实现了java的反射机制,在使用反射机制时,需要导入该包。

2.Class类的forName方法能够根据类名加载类,获得类的Class对象。

Class类的getSuperclass方法获得父类的Class对象;getDeclaredFields方法获取类声明的属性,返回的是一组java.lang.Field对象;getDeclaredConstructors方法获得类的构造方法,返回的是一组java.lang.reflect.Constructor对象;getMethods方法获得类的方法,返回的是一组java.lang.reflect.Method的对象。

3.java.olang.reflect.Field描述类声明的属性。getModifiers方法获得属性的访问修饰符;getType方法获得属性的类型;getName方法获得属性名。

4.java.lang.reflect.Constructor描述类的构造方法。getModifiers方法获得构造方法的访问修饰符;getName方法获得方法名,getParameterTypes获得构造方法的参数类型;getExCeptionTypes方法获得构造方法声明的异常。

5.java.lang.reflect.Method描述类声明的方法。getModifiers方法获得方法的访问修饰符;getReturnType方法返回方法的返回类型;getName方法获得方法名;getParameterTypes方法案获得方法的参数类型;getExceptionTypes方法获得声明的异常。

package com.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier; public class Main{ /*获取类的声明*/
private String getClassStatement(Class c){
StringBuffer buf = new StringBuffer();
if(c.getName().equals("java.lang.Object")){
buf.append("public class Object {");
return buf.toString();
} else {
//得到该类的父类名
String superName = c.getSuperclass().getName();
buf.append("public class ").append(c.getName()).append(" extends ").append(superName).append(" {");
return buf.toString();
}
} /*获取类的属性*/
private String getFields(Class c){
StringBuffer buf = new StringBuffer();
Field[] fields = c.getDeclaredFields();
for(Field field : fields){
//获取属性的访问修饰符
//Modifier的一些信息 http://www.it165.net/pro/html/201309/7203.html
buf.append(" ").append(Modifier.toString(field.getModifiers())).append(" ");
Class<?> type = field.getType();
buf.append(type.getName()).append(" ");
buf.append(field.getName()).append(";\n");
}
return buf.toString();
} /*获取类的所有构造方法*/
private String getConstructors(Class c){
StringBuffer buf = new StringBuffer();
//获取类的构造方法
Constructor<?>[] cons = c.getDeclaredConstructors();
for(Constructor con : cons){
//获取构造方法的访问修饰符
buf.append(" ").append(Modifier.toString(con.getModifiers())).append(" ");
//获取构造方法的名称
buf.append(con.getName()).append("(");
//获取构造方法的参数
Class<?>[] paramType = con.getParameterTypes();
for(int i=0; i<paramType.length; ++i){
if(i != 0){
buf.append(paramType[i].getName());
} else {
buf.append(", ").append(paramType[i].getName());
}
}
buf.append(")"); //获取方法声明的异常
Class<?>[] excepTypes = con.getExceptionTypes();
for(int i=0; i<excepTypes.length; ++i){
if(i==0){
buf.append(" throws ").append(excepTypes[i].getName());
} else {
buf.append(", ").append(excepTypes[i].getName());
}
}
buf.append(";\n");
}
return buf.toString();
} private String getMethods(Class c){
StringBuffer buf = new StringBuffer();
Method[] methods = c.getDeclaredMethods();
for(Method method : methods){
//获取方法的访问修饰符
buf.append(" ").append(Modifier.toString(method.getModifiers())).append(" ");
//获取方法的返回类型
Class<?> returnType = method.getReturnType();
buf.append(returnType.getName()).append(" ");
buf.append(method.getName()).append(" (");//获取方法的名称 //获取方法的参数类型
Class<?>[] paramTypes = method.getParameterTypes();
for(int i=0; i<paramTypes.length; ++i){
if(i==0){
buf.append(paramTypes[i].getName());
} else {
buf.append(", ").append(paramTypes[i].getName());
}
}
buf.append(")"); //获取方法声明的异常
Class<?>[] excepTypes = method.getExceptionTypes();
for(int i=0; i<excepTypes.length; ++i){
if(i==0){
buf.append(" throws ").append(excepTypes[i].getName());
} else {
buf.append(", ").append(excepTypes[i].getName());
}
}
buf.append(";\n");
}
return buf.toString();
} public void getClassMessage(){
StringBuffer buf = new StringBuffer();
try {
Class<?> c = Class.forName("com.test.Main");
buf.append("/*类的声明*/\n");
buf.append(getClassStatement(c));
buf.append("\n");
buf.append(" /*字段*/\n");
buf.append(getFields(c));
buf.append(" /*构造器*/\n");
buf.append(getConstructors(c));
buf.append(" /*方法*/\n");
buf.append(getMethods(c));
buf.append("}\n");
System.out.println(buf.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} public static void main(String[] args) throws Exception{
new Main().getClassMessage();
}
}

输出结果

/*类的声明*/
public class com.test.Main extends java.lang.Object {
/*字段*/
/*构造器*/
public com.test.Main();
/*方法*/
private java.lang.String getClassStatement (java.lang.Class);
public void getClassMessage ();
public static void main ([Ljava.lang.String;) throws java.lang.Exception;
private java.lang.String getConstructors (java.lang.Class);
private java.lang.String getFields (java.lang.Class);
private java.lang.String getMethods (java.lang.Class);
}

java获取类的信息的更多相关文章

  1. [Java反射基础二]获取类的信息

    本文接上文“Class类的使用”,以编写一个用来获取类的信息(成员函数.成员变量.构造函数)的工具类来讲解"反射之获取类的信息" 1.获取成员函数信息 /** * 获取成员函数信息 ...

  2. java获取当前操作系统的信息

    java获取当前操作系统的信息 JavaOS虚拟机UnixEXT  从网上收集的一些关于java获取操作系统信息的方法,现在总结一下: 1获取本机的IP地址: private static Strin ...

  3. java获取天气预报的信息

    运行效果: 主要功能: 1,jsp页面输入省份和城市 根据条件获取当地的天气信息 2,java代码 利用第三方的省份和城市的路径地址 本工程主要实现java获取天气预报的信息步骤1,创建工程weath ...

  4. 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息

    0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...

  5. Java 反射(二)运行时获取类的信息

    目录 一.获得类的运行时结构 1. 获得类的名字 2. 获得类的属性 获取属性列表 获取指定属性 3. 获取类的方法 获得类的方法列表 获得指定方法 4. 获得的构造器 获得构造器列表 获得指定构造器 ...

  6. Java 获取所有子类信息

    我以前的博客(Java Scala获取注解的类信息)介绍过通过Reflections工具通过使用特定注解的类的信息,其实本工具也可以获取接口,抽象类,类等的所有子类信息.使用方法如下: Reflect ...

  7. Java 获取到配置文件信息

    Java程序将数据库或者服务器IP写入到代码中,难免缺少灵活性. 如果写入到配置文件,部署到不通服务器上,只需要修改配置文 件即可. Java怎么读取配置文件 /** * 获取到配置文件信息 * @p ...

  8. JAVA获取系统相关信息

    Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00003596 获取JRE系统相关参数 java 通过S ...

  9. Java获取系统相关信息System.getProperty()

    java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装目 ...

随机推荐

  1. 德国W家HIPP 奶粉有货播报:2014.6.25 HIPP 1+ 4盒装有货啦!

    德国W家HIPP 奶粉有货播报:2014.6.25 HIPP 1+ 4盒装有货啦!

  2. 原生AJAX封装

    var ajaxHelper = { /*1.0 浏览器兼容的方式创建异步对象*/ makeXHR: function () { //声明异步对象变量 var xmlHttp = false; //声 ...

  3. 【ORACLE】字符串操作 B字符串时A的一部分

    select * from a where instr(a,b)>0;用于实现B字段是A字段中的某一部分的时候,要论顺序或者要相邻的字符. 如果想要不论顺序或者不相邻的字符时,定义函数可以实现: ...

  4. mas_makeConstraints && mas_remakeConstraints && mas_updateConstraints 用法与注意事项

    mas_makeConstraints && mas_remakeConstraints && mas_updateConstraints 用法与注意事项 字数400 ...

  5. label 多行显示自适应高度

    //项目中显示 地址:XXXXXXX换行  UILabel *numLable = [[UILabel alloc] initWithFrame:CGRectMake(80, 50, 40, 20)] ...

  6. log4net写入mysql完整例子

    1,创建表log   CREATE TABLE `log` ( `id`  int(11) NOT NULL AUTO_INCREMENT , `log_datetime`  timestamp NO ...

  7. sphinx搜索实例

    多个关键词搜索一个字段的几种方式测试 @proname "ygm" "磨粉机" "2" //搜索结果proname字段必须同时包含3个词,有 ...

  8. jQuery的4种事件绑定方法

    jQuery中提供了四种绑定事件的方法,分别是bind.live.delegate.on,对应的解除监听的函数分别是unbind.die.undelegate.off: 一.on()方法(首选方法) ...

  9. Javascript 小技能

     /* @@截取字符串长度,汉字算2个字符 @@return [string]+'...' */ var subString = function(str, len) {     var newLen ...

  10. ubuntu 安装与开始学习

    下载地址 http://cn.ubuntu.com/download/ 经验: 1.遇到安装问题,首先尝试解读错误,再使用  ./configure --help  不行再上Stack overflo ...