java反射:獲取類的成員變量和構造函數

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章