1、Class類的使用java
1 Class c1 =int.class;//int的類類型
2 Class c2 =String.class;//String類的類類型,能夠理解爲編譯生成的那個String.class字節碼文件, 3 //固然,這並非官方的說法
4 Class c3 =double.class; 5 Class c4 =Double.class; 6 Class c5 =void.class;
1 /**
2 * 打印類的信息,包括類的成員函數,成員變量 3 * @param obj 該對象所屬類的信息 4 */
5 publicstaticvoid printClassMessage(Object obj){ 6 //要獲取類的信息,首先要獲取類的類類型
7 Class c = obj.getClass();//傳遞的是哪一個子類的對象,c就是該子類的類類型 8 //獲取類的名稱
9 System.out.println("累的名稱是:"+c.getName()); 10
11 /*
12 * Method類,方法的對象 13 * 一個成員方法就是一個Method對象 14 * getMethods()方法獲取的是全部的public的函數,包括父類繼承而來的 15 * getDeclaredMethods()獲取的是多有該類本身聲明的方法,不問訪問權限 16 */
17 Method[] ms = c.getMethods();//c.getDeclaredMethods();
18 for(int i =0; i < ms.length; i++){ 19 //獲得方法的返回值類型的類類型
20 Class retrunType = ms[i].getReturnType(); 21 System.out.print(retrunType.getName()+" "); 22 //獲得方法的名稱
23 System.out.print(ms[i].getName()+"("); 24 //獲取的參數類型--->獲得的是參數列表的類型的類類型
25 Class[] paraTypes = ms[i].getParameterTypes(); 26 for(Class class1 : paraTypes){ 27 System.out.print(class1.getName()+","); 28 } 29 System.out.println(")"); 30 } 31 }
Class的API中還有不少其餘的方法,能夠獲得interface、Package、Annotation等不少信息,具體使用請參考幫助手冊,本文就不在詳細講解。特別注意的一點是,若是你想獲得一個類的信息,首先就要獲取該類的類類型。
框架
1 /**
2 * 成員變量也是對象,是java.lang.reflect.Field這個類的的對象 3 * Field類封裝了關於成員變量的操做 4 * getFields()方法獲取的是全部public的成員變量的信息 5 * getDeclareFields()方法獲取的是該類本身聲明的成員變量的信息 6 */
7 Field[] fs = c.getDeclaredFields(); 8 for(Field field : fs){ 9 //獲得成員變量的類型的類類型
10 Class fieldType = field.getType(); 11 String typeName = fieldType.getName(); 12 //獲得成員變量的名稱
13 String fieldName = field.getName(); 14 System.out.print(typeName+" "+fieldName); 15 } 16
17
18 /**
19 * 構造函數也是對象 20 * java.lang.Constructor中封裝了構造函數的信息 21 * getConstructor()方法獲取全部的public的構造函數 22 * getDeclaredConstructors獲得全部的構造函數 23 */
24 Constructor[] cs = c.getDeclaredConstructors(); 25 for(Constructor constructor : cs){ 26 System.out.print(constructor.getName()+"("); 27 //獲取構造函數的參數列表---》獲得的是參數雷彪的類類型
28 Class[] paramTypes = constructor.getParameterTypes(); 29 for(Class class1 : paramTypes){ 30 System.out.print(class1.getName()+","); 31 } 32 System.out.println(")"); 33 }
5、方法反射的基本操做函數
1 ArrayList list1 =newArrayList(); 2 ArrayList<String> list2 =newArrayList<String>(); 3
4 Class c1 = list1.getClass(); 5 Class c2 = list2.getClass(); 6
7 System.out.println(c1==c2);//結果爲true,爲何??