首頁 > 易卦

Java反射之類物件

作者:由 動力節點Java培訓 發表于 易卦日期:2022-12-20

怎樣獲取物件名稱

Java反射之類物件是什麼?動力節點小編來告訴大家。JAVA反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意方法和屬性;這種動態獲取資訊以及動態呼叫物件方法的功能稱為java語言的反射機制。

Java反射之類物件

反射就是把java類中的各種成分對映成一個個的Java物件。例如:一個類有:成員變數、方法、構造方法、包等等資訊,利用反射技術可以對一個類進行解剖,把個個組成部分對映成一個個物件。(其實:一個類中這些成員方法、構造方法、在加入類中都有一個類來描述)如圖是類的正常載入過程:反射的原理在與class物件。熟悉一下載入的時候:Class物件的由來是將class檔案讀入記憶體,併為之建立一個Class物件。

Java反射機制主要提供的功能:

1。在執行時判斷任意一個物件所屬的類

2。在執行時構造任意一個類的物件

3。在執行時判斷任意一個類所具有的成員變數和方法

4。在執行時呼叫任意一個物件的方法

看了解釋還是很模糊,那我們先了解一下其他的,什麼是類物件?

在理解類物件之前,先說說我們熟悉的物件之間的區別:亞索和盲僧都是一個英雄物件,他們的區別在於各自有不同的名稱,技能,血量。

然後說說類之間的區別,Hero和Item都是類,他們得區別在於有不同的方法,不同的屬性。

類物件,就是用來描述這種類,都有什麼屬性,什麼方法的。所有的類,都存在一個類物件,這個類物件用於提供類本身的資訊,比如有幾種構造方法,有多少屬性,有哪些普通方法。

獲取類物件

1。與傳統的透過new來獲取物件的方式不同

反射機制,會先拿到Hero的“類物件”,然後透過類物件獲取“構造器物件”

再透過構造器物件建立一個物件

獲取類物件有3種方式

1。Class。forName

2。Hero。class

3。new Hero()。getClass()

最後小編簡單說一下反射有什麼用

反射非常強大,但是學習了之後,會不知道該如何使用,反而覺得還不如直接呼叫方法來的直接和方便。

通常來說,需要在學習了Spring的依賴注入,反轉控制之後,才會對反射有更好的理解,但是剛學到這裡的同學,不一定接觸了Spring,所以在這裡舉兩個例子,來演示一下反射的一種實際運用。

1。首先準備兩個類Service1。Java

package Reflect。fanshe; public class Service1 { public void doService1(){ System。out。println(“業務方法1”); }}

和Service2。Java

package Reflect。fanshe; public class Service2 { public void doService2(){ System。out。println(“業務方法2”); }}

2。若是用非反射方法從第一個業務切換到第二個業務,必須修改程式碼,並且重新編譯執行,才可以達到效果

package reflection; public class Test { public static void main(String[] args) {// new Service1()。doService1(); new Service2()。doService2(); }}

3。使用反射方法

使用反射方式,首先準備一個配置檔案,就叫做spring。txt吧,放在file目錄下。裡面存放的是類的名稱,和要呼叫的方法名。

在測試類Test中,首先取出類名稱和方法名,然後透過反射去呼叫這個方法。

當需要從呼叫第一個業務方法,切換到呼叫第二個業務方法的時候,不需要修改一行程式碼,也不需要重新編譯,只需要修改配置檔案spring。txt,再執行即可。

這也是Spring框架的最基本的原理,只是它做的更豐富,安全,健壯。

Java反射之類物件

package Reflect。fanshe; import java。io。File;import java。io。FileInputStream;import java。lang。reflect。Constructor;import java。lang。reflect。Method;import java。util。Properties; public class Test { @SuppressWarnings({“rawtypes”,“unchecked”}) public static void main(String[] args) throws Exception{ File f = new File(“E:/file/LOL/spring。txt”); Properties scf = new Properties(); scf。load(new FileInputStream(f)); String className = (String) scf。get(“class”); String methodName = (String)scf。get(“method”); //根據類名獲取物件 Class cla = Class。forName(className); //根據方法名稱,獲取方法物件 Method m = cla。getMethod(methodName); //獲取構造器 Constructor c = cla。getConstructor(); //根據構造器,例項化出物件 Object service = c。newInstance(); //呼叫物件的指定方法 m。invoke(service); }}

結果

Java反射之類物件