JAVA reflect (反射) 分析类结构
2016-04-26 13:25
453 查看
一、数据准备
Java反射分析用到的Human类package ReflectAnalysis; public class Human { public String name; private int age; public Human(String name, int age){ this.name = name; this.setAge(age); } public void setAge(int age) { this.age = age; } public int getAge() { return age; } }
二、反射分析类域
以name域为例:
public String name;
其中,反射分析如下
1. 获取JAVA修饰符,如 public、protected、final、static等,java reflect api:
Modifier.toString(fields[i].getModifiers())
其中
fields[i].getModifiers()获得以整数形式返回的该 Field 对象表示的字段的 Java 语言修饰符。
Modifier.toString()方法返回Java 语言修饰符的字符串形式。
JAVA API对修饰符的说明:修饰符由 Java 虚拟机的 public、protected、private、final、static、abstract 和 interface 对应的常量组成;它们应当使用 Modifier 类的方法来解码。
当有多个修饰符修饰变量时,
Field对象的
getModifiers返回的整数值不同,例如当修饰符只有public时,返回值为1;当修饰符为public static时,返回值为9。JDK源码中对返回值的定义如下
/* * Access modifier flag constants from <em>The Java Virtual * Machine Specification, Second Edition</em>, tables 4.1, 4.4, * 4.5, and 4.7. */ /** * The <code>int</code> value representing the <code>public</code> * modifier. */ public static final int PUBLIC = 0x00000001; /** * The <code>int</code> value representing the <code>private</code> * modifier. */ public static final int PRIVATE = 0x00000002; /** * The <code>int</code> value representing the <code>protected</code> * modifier. */ public static final int PROTECTED = 0x00000004; /** * The <code>int</code> value representing the <code>static</code> * modifier. */ public static final int STATIC = 0x00000008; /** * The <code>int</code> value representing the <code>final</code> * modifier. */ public static final int FINAL = 0x00000010; /** * The <code>int</code> value representing the <code>synchronized</code> * modifier. */ public static final int SYNCHRONIZED = 0x00000020; /** * The <code>int</code> value representing the <code>volatile</code> * modifier. */ public static final int VOLATILE = 0x00000040; /** * The <code>int</code> value representing the <code>transient</code> * modifier. */ public static final int TRANSIENT = 0x00000080; /** * The <code>int</code> value representing the <code>native</code> * modifier. */ public static final int NATIVE = 0x00000100; /** * The <code>int</code> value representing the <code>interface</code> * modifier. */ public static final int INTERFACE = 0x00000200; /** * The <code>int</code> value representing the <code>abstract</code> * modifier. */ public static final int ABSTRACT = 0x00000400; /** * The <code>int</code> value representing the <code>strictfp</code> * modifier. */ public static final int STRICT = 0x00000800; // Bits not (yet) exposed in the public API either because they // have different meanings for fields and methods and there is no // way to distinguish between the two in this class, or because // they are not Java programming language keywords static final int BRIDGE = 0x00000040; static final int VARARGS = 0x00000080; static final int SYNTHETIC = 0x00001000; static final int ANNOTATION= 0x00002000; static final int ENUM = 0x00004000;
Modifier.toString()源码如下:
public static String toString(int mod) { StringBuffer sb = new StringBuffer(); int len; if ((mod & PUBLIC) != 0) sb.append("public "); if ((mod & PROTECTED) != 0) sb.append("protected "); if ((mod & PRIVATE) != 0) sb.append("private "); /* Canonical order */ if ((mod & ABSTRACT) != 0) sb.append("abstract "); if ((mod & STATIC) != 0) sb.append("static "); if ((mod & FINAL) != 0) sb.append("final "); if ((mod & TRANSIENT) != 0) sb.append("transient "); if ((mod & VOLATILE) != 0) sb.append("volatile "); if ((mod & SYNCHRONIZED) != 0) sb.append("synchronized "); if ((mod & NATIVE) != 0) sb.append("native "); if ((mod & STRICT) != 0) sb.append("strictfp "); if ((mod & INTERFACE) != 0) sb.append("interface "); if ((len = sb.length()) > 0) /* trim trailing space */ return sb.toString().substring(0, len-1); return ""; }
2.获取域数据类型
fields[i].getType().getName();
3.Field域反射分析代码
public static void printFields(Class<?> classobj){ System.out.println(" //Fileds"); String modifier = ""; String type = ""; String name = ""; Field [] fields = classobj.getDeclaredFields(); for(int i = 0; i <= fields.length - 1; i++){ modifier = Modifier.toString(fields[i].getModifiers()); type = fields[i].getType().getName(); name = fields[i].getName(); System.out.println(" " + modifier + " " + type + " " + name + ";"); } System.out.println(); }
三、反射分析类方法
以如下方法为例public void setAge(int age) { this.age = age; }
1.获取JAVA修饰符
参照第二部分的
反射分析类域中内容。
2.获取方法的返回值
methods[i].getReturnType().getName();
3.获取方法的参数
Class [] paraClasses = methods[i].getParameterTypes();
4.Method方法反射分析代码
public static void printMethods(Class<?> classobj){ System.out.println(" //Methods"); String modifier = ""; String returnType = ""; String name = ""; Class [] paraClasses = null; StringBuffer paraType = new StringBuffer(); Method [] methods = classobj.getDeclaredMethods(); for(int i = 0; i <= methods.length - 1; i++){ modifier = Modifier.toString(methods[i].getModifiers()); returnType = methods[i].getReturnType().getName(); name = methods[i].getName(); paraClasses = methods[i].getParameterTypes(); for(int j = 0; j <= paraClasses.length - 1; j++){ if(j != paraClasses.length - 1){ paraType.append(paraClasses[j].getName() + ", "); } else{ paraType.append(paraClasses[j].getName()); } } System.out.println(" " + modifier + " " + returnType + " " + name + "(" + paraType.toString() + ")"); } System.out.println(); }
四、反射分析类构造器方法
参照第三部分反射分析类方法。
构造器方法反射分析代码
public static void printConstructors(Class<?> classobj){ System.out.println(" //Constructors"); Constructor [] constructors = classobj.getConstructors(); String modifier = ""; String name = ""; Class [] paraClasses = null; StringBuffer paraType = new StringBuffer(); for(int i = 0; i <= constructors.length - 1; i++){ modifier = Modifier.toString(constructors[i].getModifiers()); name = constructors[i].getName(); paraClasses = constructors[i].getParameterTypes(); for(int j = 0; j <= paraClasses.length - 1; j++){ if(j != paraClasses.length - 1){ paraType.append(paraClasses[j].getName() + ", "); } else{ paraType.append(paraClasses[j].getName()); } } System.out.println(" " + modifier + " " + name + "(" + paraType.toString() + ")"); } System.out.println(); }
五、程序完整测试代码
package ReflectAnalysis;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class ClassReflectAnalysis {
public static void main(String[] args) {
Class<Human> classobj = Human.class;
String parentName = classobj.getSuperclass().getName();
String modifier = Modifier.toString(classobj.getModifiers());
Class [] interfaces = classobj.getInterfaces();
StringBuffer interfacesBuf = new StringBuffer();
if(interfaces.length != 0){
interfacesBuf.append("implements ");
for(int i = 0; i <= interfaces.length - 1; i++){
if(i != interfaces.length - 1){
interfacesBuf.append(interfaces[i].getName() + ",");
}else{
interfacesBuf.append(interfaces[i].getName());
}
}
}
String Header = modifier + " class " + classobj.getName() + " extends " + parentName + interfacesBuf.toString() + "{";
System.out.println(Header + "\n");
printFields(classobj);
printMethods(classobj);
printConstructors(classobj);
System.out.println("}");
}
public static void printFields(Class<?> classobj){ System.out.println(" //Fileds"); String modifier = ""; String type = ""; String name = ""; Field [] fields = classobj.getDeclaredFields(); for(int i = 0; i <= fields.length - 1; i++){ modifier = Modifier.toString(fields[i].getModifiers()); type = fields[i].getType().getName(); name = fields[i].getName(); System.out.println(" " + modifier + " " + type + " " + name + ";"); } System.out.println(); }
public static void printMethods(Class<?> classobj){ System.out.println(" //Methods"); String modifier = ""; String returnType = ""; String name = ""; Class [] paraClasses = null; StringBuffer paraType = new StringBuffer(); Method [] methods = classobj.getDeclaredMethods(); for(int i = 0; i <= methods.length - 1; i++){ modifier = Modifier.toString(methods[i].getModifiers()); returnType = methods[i].getReturnType().getName(); name = methods[i].getName(); paraClasses = methods[i].getParameterTypes(); for(int j = 0; j <= paraClasses.length - 1; j++){ if(j != paraClasses.length - 1){ paraType.append(paraClasses[j].getName() + ", "); } else{ paraType.append(paraClasses[j].getName()); } } System.out.println(" " + modifier + " " + returnType + " " + name + "(" + paraType.toString() + ")"); } System.out.println(); }
public static void printConstructors(Class<?> classobj){ System.out.println(" //Constructors"); Constructor [] constructors = classobj.getConstructors(); String modifier = ""; String name = ""; Class [] paraClasses = null; StringBuffer paraType = new StringBuffer(); for(int i = 0; i <= constructors.length - 1; i++){ modifier = Modifier.toString(constructors[i].getModifiers()); name = constructors[i].getName(); paraClasses = constructors[i].getParameterTypes(); for(int j = 0; j <= paraClasses.length - 1; j++){ if(j != paraClasses.length - 1){ paraType.append(paraClasses[j].getName() + ", "); } else{ paraType.append(paraClasses[j].getName()); } } System.out.println(" " + modifier + " " + name + "(" + paraType.toString() + ")"); } System.out.println(); }
}
六、运行结果
public class ReflectAnalysis.Human extends java.lang.Object{ //Fileds public java.lang.String name; private int age; //Methods public void setAge(int) public int getAge(int) //Constructors public ReflectAnalysis.Human(java.lang.String, int) }
相关文章推荐
- java基础(27)--JMX
- Java中连接各种数据库的方法
- Java中的散列映射
- 21. Merge Two Sorted Lists--java
- Java泛型 extends,super和通配符的理解
- hdoj2004(java)成绩转换
- KMP算法
- hdoj2003求绝对值(java)
- Java基础(十),流
- Struts中使用json-lib-2.4-jdk15.jar时抛出Source not found
- 利用递归解决汉诺塔问题
- 利用递归解决汉诺塔问题
- Struts2基础知识(二)
- Java使用OpenCV人脸检测
- Java使用OpenCV
- spring通过注解实现声明式事务控制
- Eclipse使用jUnit4对MapReduce程序进行单元测试
- spring之context
- 详细介绍Java垃圾回收机制
- RabbitMQ学习之Java客户端连接测试(二)