1 import java.lang.reflect.Constructor; 2 import java.lang.reflect.*; 3 4 /*Class:表明一個字節碼文件的對象,每當有類被加載進內存,JVM就會在堆上給 5 * 該類建立一個表明該類的對象。每一個類的Class對象是的。 6 *Class類沒有構造方法,得到類對應的Class方法有3種 7 *1.:getClass()、2.類、接口.class 、3.Class.forName("類全名"); 8 *比較推薦使用第3種方式,使用前兩種方式程序擴展性很差。 9 * 10 *Class類中定義了許多關於獲取類中信息的方法: 11 *1.得到該類的構造方法,屬性,方法、實例的方法。包含特定狀況的得到 12 *2.得到該類的父類,實現的接口,該類的類加載器,類名、包名等。 13 *3.判斷該類的具體是接口、類、內部類等 14 *4.方法中加Declared表示能夠得到本類定義的任何方法和屬性 15 * 16 *注意:關於得到到的方法、屬性、構造器的具體操做被封裝在import java.lang.reflect包裏面 17 *Method:裏面最經常使用的方法invoke(對象,可變參數列表)--調用指定的方法 18 *Field:get/set;獲取和修改屬性值 19 *Constrcutor:使用newInstance(可變參數列表)--調用指定構造方法建立類的實例 20 *注意:私有的要調用前先去掉訪問權限限制setAccssible() 21 * */ 22 public class ReflectionWithClass { 23 24 public static void main(String[] args) throws Exception { 25 26 //第一種方式得到Class對象,比較麻煩,要先建立對象,再使用對象調用方法 27 HelloKitty ht = new HelloKitty(); 28 Class clazz = ht.getClass(); 29 30 //第二種方式得到Class對象。使用靜態的屬性建立 31 Class clazz1 = HelloKitty.class; 32 33 //使用Class對象的靜態方法得到Class對象 34 Class clazz2 = Class.forName("HelloKitty"); 35 36 //得到該類的類加載器 37 ClassLoader c = clazz2.getClassLoader(); 38 System.out.println(c.toString()); 39 40 Class clazz3 = String.class; 41 System.out.println(clazz3.getClassLoader()); 42 43 //得到該類的實例 44 Object obj = clazz2.newInstance(); 45 //得到該類的構造器---公開的,getDeclaredConstructors()--能夠得到私有的 46 Constructor[] con = clazz2.getDeclaredConstructors(); 47 for(Constructor cc:con){ 48 System.out.print(cc + " "); 49 } 50 51 //得到類的方法 52 Method[] mm = clazz2.getDeclaredMethods(); 53 for(Method mmm:mm){ 54 System.out.print(mmm + " "); 55 } 56 57 System.out.println(); 58 //獲取特定的方法 59 Method m = clazz2.getMethod("walk",null); 60 System.out.println(m.toString()); 61 62 Field[] f = clazz2.getDeclaredFields(); 63 for(Field ff:f){ 64 System.out.print(ff+ " "); 65 } 66 67 //調用指定的方法---先獲取,在調用;注意私有方法先設置訪問權限 68 Method m1 = clazz2.getMethod("walk", null); 69 System.out.println("hahahhha"); 70 m1.invoke(obj,null); 71 72 //調用指定的構造方法建立類實例;先獲取在調用 73 Constructor cc = clazz2.getConstructor(int.class,String.class); 74 Object o1 = cc.newInstance(12,"blue"); 75 76 //獲取和修改對象的屬性值 77 Field ffs = clazz2.getDeclaredField("age"); 78 ffs.setAccessible(true); 79 ffs.set(obj, 29); 80 Object oo = ffs.get(obj); 81 System.out.println(oo); 82 83 } 84 85 } 86 87 class HelloKitty { 88 private int age; 89 public String color = "pink"; 90 public HelloKitty() {} 91 92 93 public HelloKitty(int age) { 94 this.age = age; 95 } 96 97 public HelloKitty(int age,String color) { 98 this.age = age; 99 this.color = color; 100 System.out.println("okokok"); 101 } 102 103 public void walk(){ 104 System.out.println("hhhhhhhhhhhhh"); 105 } 106 107 public void talk(int i){ 108 System.out.println(i + "----------" + age); 109 } 110 }