Java 反射機(jī)制是在運(yùn)行狀態(tài)中,對于任意一個(gè)類,都能夠獲得這個(gè)類的所有屬性和方法,對于任意一個(gè)對象都能夠調(diào)用它的任意一個(gè)屬性和方法。
這種在運(yùn)行時(shí)動態(tài)的獲取信息以及動態(tài)調(diào)用對象的方法的功能稱為 Java 的反射機(jī)制。 (推薦學(xué)習(xí):java課程)
Class 類與 java.lang.reflect 類庫一起對反射的概念進(jìn)行了支持,該類庫包含了 Field,Method,Constructor 類 (每個(gè)類都實(shí)現(xiàn)了 Member 接口)。這些類型的對象時(shí)由 JVM 在運(yùn)行時(shí)創(chuàng)建的,用以表示未知類里對應(yīng)的成員。
這樣你就可以使用 Constructor 創(chuàng)建新的對象,用 get() 和 set() 方法讀取和修改與 Field 對象關(guān)聯(lián)的字段,用 invoke() 方法調(diào)用與 Method 對象關(guān)聯(lián)的方法。
另外,還可以調(diào)用 getFields() getMethods() 和 getConstructors() 等很便利的方法,以返回表示字段,方法,以及構(gòu)造器的對象的數(shù)組。這樣匿名對象的信息就能在運(yùn)行時(shí)被完全確定下來,而在編譯時(shí)不需要知道任何事情。
通過反射機(jī)制獲取類信息
通過反射機(jī)制創(chuàng)建對象,在創(chuàng)建對象之前要獲得對象的構(gòu)造函數(shù)對象,通過構(gòu)造函數(shù)對象創(chuàng)建對應(yīng)類的實(shí)例。
下面這段代碼分別在運(yùn)行期間創(chuàng)建了一個(gè)無參與有參的對象實(shí)例。由于 getConstructor() 方法與 newInstance() 方法拋出了很多異常 (你可以通過源代碼查看它們),這里就簡寫了直接拋出一個(gè) Exception,下同。
package com.jas.reflect; import java.lang.reflect.Constructor; public class ReflectTest { public static void main(String[] args) throws Exception { Class clazz = null; clazz = Class.forName("com.jas.reflect.Fruit"); Constructor<Fruit> constructor1 = clazz.getConstructor(); Constructor<Fruit> constructor2 = clazz.getConstructor(String.class); Fruit fruit1 = constructor1.newInstance(); Fruit fruit2 = constructor2.newInstance("Apple"); } } class Fruit{ public Fruit(){ System.out.println("無參構(gòu)造器 Run..........."); } public Fruit(String type){ System.out.println("有參構(gòu)造器 Run..........." + type); } }
輸出:
無參構(gòu)造器 Run........... 有參構(gòu)造器 Run...........Appl