一、数据准备
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)
}