前面我們講到過怎麼利用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,)