JAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。
要想解剖一個類,必須先要獲取到該類的字節碼文件對象。而解剖使用的就是Class類中的方法.因此先要獲取到每個字節碼文件對應的Class類型的對象.
反射技術解決問題:初始代碼固定後,減小修改代碼,動態獲取類
在普通類上層還有類,Class類,加載文件的時候就建立了Class對象
######################################################################
獲取Class對象的方式:
######一:經過object的getClass方法獲取,反射技術不適用這種方法
經過對象調用getClass方法java
Person p1 = new Person(); Person p2 = new Person(); Class clazz1 = p1.getClass(); Class clazz2 = p2.getClass(); System.out.println(clazz1 == clazz2);//true // System.out.println(clazz1.getName());//獲取類的名字。
######二:每一個數據都有默認的靜態屬性,.class,用該屬性就能夠獲取字節碼文件對象
經過類.class獲取。
Class clazz = Person.class;
######三:forName方法,經過名稱就能夠獲取對應的字節碼文件對象,經常使用方法dom
String className = "cn.itcast.domain.Person"; //類名前面須要加包名#########################(重) // 1,經過給定的類名稱,加載對應的字節碼文件,並封裝成字節碼文件對象Class. Class clazz = Class.forName(className); // System.out.println(clazz); //經過newInstance()就能夠建立字節碼對象所表示的類的實例。 /* * 2,經過new建立給定的類的實例。 * 3,調用該類的構造函數。 * 一般被反射的類都會有提供空參數的構造函數。 * 沒有對應的構造函數,會報InstantiationException * 若是有提供,可是權限不夠,會報IllegalAccessException */ Object obj = clazz.newInstance(); /* Person p = new Person(); * 1,加載Person類,並將Person類封裝成字節碼文件對象。 * 2,經過new建立Person對象。 * 3,調用構造函數對對象初始化。 */ System.out.println(obj);
#########################################################################
建立構造函數函數
String className = "cn.itcast.domain.Person"; Class clazz = Class.forName(className); //獲取指定的構造器。獲取Person類中兩個參數string,int的構造函數。 Constructor cons = clazz.getConstructor(String.class,int.class); //有了構造器對象後,經過構造器對象來初始化給類對象。 Object obj = cons.newInstance("wangwu",23); //Person p = new Person("lisi",21); System.out.println(obj);