前面我们讲到过怎么利用java反射机制获取类的所有方法的信息。那么我们如何利用反射获取类的成员变量以及构造函数的信息呢?
首先我们明确一个概念:成员变量也是对象,我们可以通过成员变量的类类型获取到成员变量的类型
Class c=int.class;
System.out.println(c.getName());
则我们会看到控制台输出:int,意味着基本数据类型也是对象,我们可以通过数据类型的类类型获取到它的基本类型
那么成员变量是哪个类的对象呢?成员变量是java.lang.reflect.Field类的对象,该类提供了一些方法是我们能够获取到成员变量的类型、名称等信息,接下来通过一段代码进行测试:
public static void printDataTypeMessage(Object obj) {
System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
Class c=obj.getClass();
//Field[] fs=c.getFields();//获取的是所有的public的成员变量,
Field[] fs=c.getDeclaredFields();//获取所有自己声明的成员变量的信息
for (Field field : fs) {
Class fieldType=field.getType();//得到成员变量的类型的类类型
String typeName=fieldType.getName();
String fieldName=field.getName();//成员变量的名称
System.out.println(typeName+" "+fieldName);
}
}
获取String类的成员变量:
ClassAPI.printDataTypeMessage("hello");
运行结果为:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[C value
int hash
long serialVersionUID
[Ljava.io.ObjectStreamField; serialPersistentFields
java.util.Comparator CASE_INSENSITIVE_ORDER
由此获取了所有的成员变量,包括公有的和私有的
那么构造函数是对象吗?构造函数也是对象,它是java.lang.Constructor类的对象,我们通过一段代码来测试一下如何获取构造函数的基本信息:
public static void printConstructorMessage(Object obj) {
System.out.println("===============================================");
Class c=obj.getClass();
Constructor[] con=c.getDeclaredConstructors();//获得所有的公有的构造方法,构造函数都是自己声明的
for (Constructor constructor : con) {
String conName=constructor.getName();
System.out.print(conName+"(");
Class[] types=constructor.getParameterTypes();//得到参数列表的类类型
for (Class class1 : types) {
System.out.print(class1.getName()+",");
}
System.out.println(")");
}
}
对String类的构造函数和Integer类的构造函数进行测试:
ClassAPI.printConstructorMessage("hello");
ClassAPI.printConstructorMessage(new Integer(1));
得到运行结果为:
===============================================
java.lang.String([B,int,int,)
java.lang.String([B,java.nio.charset.Charset,)
java.lang.String([B,java.lang.String,)
java.lang.String([B,int,int,java.nio.charset.Charset,)
java.lang.String([B,int,int,java.lang.String,)
java.lang.String([C,boolean,)
java.lang.String(java.lang.StringBuilder,)
java.lang.String(java.lang.StringBuffer,)
java.lang.String([B,)
java.lang.String([I,int,int,)
java.lang.String()
java.lang.String([C,)
java.lang.String(java.lang.String,)
java.lang.String([C,int,int,)
java.lang.String([B,int,)
java.lang.String([B,int,int,int,)
===============================================
java.lang.Integer(int,)
java.lang.Integer(java.lang.String,)