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