標籤:反射 java
轉載請註明:http://blog.csdn.net/uniquewonderq
首先寫一個擷取成員變數的靜態方法:
成員變數也是對象,
是java.lang.reflect.Field類的對象
Field類封裝了關於成員變數的操作
getFields()擷取的是所有的public的成員變數的資訊
getDeclaredFields()擷取的是該類自己聲明的成員變數的資訊,可能是私人的也可能是共有的
public static void printFieldMessage(Object obj){ Class c=obj.getClass();//傳遞的是哪個子類的對象,c就是該子類的類類型 /* 成員變數也是對象, 是java.lang.reflect.Field類的對象 Field類封裝了關於成員變數的操作 getFields()擷取的是所有的public的成員變數的資訊 getDeclaredFields()擷取的是該類自己聲明的成員變數的資訊,可能是私人的也可能是共有的 */ Field[] fs; //fs=c.getFields(); fs=c.getDeclaredFields(); for(Field field:fs){ //擷取成員變數類型的類類型,也就是說,如果得到的是int類型的成員變數,那麼返回int.class Class fieldType =field.getType(); String typeName=fieldType.getName();//得到成員變數類型 //得到成員變數的名字 String fieldName=field.getName(); System.out.println("成員變數類型:"+typeName+" 成員變數名為:"+fieldName); } }
測試代碼:
public static void main(String[] args) { String s="hello"; Integer integer=8; //printClassMethodMessage(s);//獲得方法資訊 printFieldMessage(integer);//獲得成員變數資訊 // printConMessage(integer); }
測試結果:
run:
成員變數類型:int 成員變數名為:MIN_VALUE
成員變數類型:int 成員變數名為:MAX_VALUE
成員變數類型:java.lang.Class 成員變數名為:TYPE
成員變數類型:[C 成員變數名為:digits
成員變數類型:[C 成員變數名為:DigitTens
成員變數類型:[C 成員變數名為:DigitOnes
成員變數類型:[I 成員變數名為:sizeTable
成員變數類型:int 成員變數名為:value
成員變數類型:int 成員變數名為:SIZE
成員變數類型:int 成員變數名為:BYTES
成員變數類型:long 成員變數名為:serialVersionUID
然後在寫一個擷取對象的構造方法的函數:
建構函式也是對象,
是java.lang.reflect.Constructor封裝了建構函式的資訊
public static void printConMessage(Object obj){ //要想擷取類的資訊,首先獲得它的類類型 Class c=obj.getClass(); /* 建構函式也是對象, 是java.lang.reflect.Constructor封裝了建構函式的資訊 */ Constructor [] cs; //cs=c.getConstructors();//獲得所有的共有的方法 cs=c.getDeclaredConstructors();//擷取所有的構造方法 for(Constructor constructor:cs){ System.out.print("構造方法 "+constructor.getName()+"("); //下面擷取建構函式的參數列表, //得到的是參數列表的類類型 Class[] paramTypes=constructor.getParameterTypes(); for(Class c1:paramTypes){ System.out.print(c1.getName()+","); } System.out.print(")"); System.out.println(); }測試代碼:
public static void main(String[] args) { String s="hello"; //Integer integer=8; //printClassMethodMessage(s);//獲得方法資訊 //printFieldMessage(integer);//獲得成員變數資訊 printConMessage(s); }
測試結果: 即string類的所有構造方法
構造方法 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--Reflect(反射)專題4——擷取成員變數以及建構函式資訊