Java反射機制概念(運行狀態中知道類所有的屬性和方法)

在Java中的反射機制是指在運行狀態中,對於任意一個類都能夠知道這個類所有的屬性和方法;並且對於任意一個對象,都能夠調用它的任意一個方法;這種動態獲取信息以及動態調用對象方法的功能稱爲Java語言的反射機制。


反射的應用場合:

首先說一下編譯時類型和運行時類型 :
在Java程序中許多對象在運行是都會出現兩種類型:編譯時類型和運行時類型。 編譯時的類型由聲明對象時實用的類型來決定,運行時的類型由實際賦值給對象的類型決定 。如: Person p=new Student(); 其中編譯時類型爲Person,運行時類型爲Student。

編譯時類型無法獲取具體方法
程序在運行時還可能接收到外部傳入的對象,該對象的編譯時類型爲Object,但是程序又需要調用該對象的運行時類型的方法。爲了解決這個問題,程序需要在運行時發現對象和類的真實信息。然而,如果編譯時根本無法預知該對象和類屬於哪些類,程序只能依靠運行時信息來發現該對象和類的真實信息,此時就必須使用到反射了。


Java反射API   

反射API用來生成JVM中的類、接口或者對象的信息。

1. Class類:反射的核心類,可以獲取類的屬性,方法等信息。
2. Field類:Java.lang.reflec包中的類,表示類的成員變量,可以用來獲取和設置類之中的屬性值。
3. Method類: Java.lang.reflec包中的類,表示類的方法,它可以用來獲取類中的方法信息或者執行方法。
4. Constructor類: Java.lang.reflec包中的類,表示類的構造方法。


反射使用步驟(獲取Class對象、調用對象方法)

1. 獲取想要操作的類的Class對象,他是反射的核心,通過Class對象我們可以任意調用類的方法。
2. 調用Class類中的方法,既就是反射的使用階段。
3. 使用反射API來操作這些信息。


獲取Class對象的3種方法

調用某個對象的getClass()方法
Person p=new Person();
Class clazz=p.getClass();

調用某個類的class屬性來獲取該類對應的Class對象
Class clazz=Person.class;

使用Class類中的forName()靜態方法(最安全/性能最好)
Class clazz=Class.forName("類的全路徑"); (最常用)

當我們獲得了想要操作的類的Class對象後,可以通過Class類中的方法獲取並查看該類中的方法和屬性。


創建對象的兩種方法

Class對象的newInstance()
1. 使用Class對象的newInstance()方法來創建該Class對象對應類的實例,但是這種方法要求該Class對象對應的類有默認的空構造器。

調用Constructor對象的newInstance()
2. 先使用Class對象獲取指定的Constructor對象,再調用Constructor對象的newInstance()方法來創建 Class對象對應類的實例,通過這種方法可以選定構造方法創建實例。

//獲取Person類的Class對象 
Class clazz=Class.forName("reflection.Person");
 

//使用.newInstane方法創建對象 
Person p=(Person) clazz.newInstance(); 


//獲取構造方法並創建對象 
Constructor c=clazz.getDeclaredConstructor(String.class,String.class,int.class); 
//創建對象並設置屬性
Person p1=(Person) c.newInstance("李四","男",20);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章