首頁 >Java >java教程 >JAVA中的反射

JAVA中的反射

WBOY
WBOY原創
2024-08-30 15:57:54902瀏覽

反射,顧名思義,是JAVA中的一個API(應用程式介面)功能,透過它可以全面檢查類別的運行時實例。它是 Java.lang.reflect 套件的一部分。這個包必須在程式開始時導入,然後呼叫函數來理解「反射」的功能。任何階級的行為都可以研究;可以在運行時使用反射 API 提取或修改元資料。

開始您的免費軟體開發課程

網頁開發、程式語言、軟體測試及其他

文法

反射API下擷取類別資訊的常用函數語法如下:

  • public String getName(parameter ):此函數傳回類別名稱。
  • public boolean isInterface(parameter ):此函數檢查該類別是否是一個接口,並傳回一個布林值(true 或 false)。
  • public boolean isArray(parameter ):此函數檢查變數是否為數組,並傳回一個布林值(true 或 false)。
  • public Constructor[] getDeclaredConstructors(parameter ) throws SecurityException: 此函式檢查類別中的建構子並傳回特定類別中使用的建構函式的數量。此外,它還有一個安全異常和與使程式不間斷工作相關的捕獲。
  • public Method[] getDeclaredMethods(parameter) throws SecurityException: 此函數檢查類別中的方法並傳回特定類別中使用的方法的數量。此外,它還有一個安全異常和相關的捕獲,使程式可以不間斷地工作。
  • public Class getSuperclass(parameter ):此函數傳回基底類別的超類別。
  • public boolean is Primitive(parameter):此函數檢查給定參數是否為原始參數並傳回一個布林值。

反射在 JAVA 中是如何運作的?

反射類別使用Java.lang.reflect套件中定義的不同方法來提取類別資訊。可以使用 getClass() 方法提取有關類別的信息,使用 getConstructors() 方法提取建構函數,使用 getMethods() 方法提取方法資訊。這些方法在反射 API 中定義,但傳回類別的訊息,包括方法、建構函數等。反射API用於JAVA程式、IDE(整合開發環境),如eclipse、Netbeans。借助以下部分提供的範例可以很好地理解這一點。

JAVA中反射的例子

下面提到了不同的例子:

範例#1

代碼:

//package test;
import java.lang.Class;
public class test{
public static void main(String args[]){
Class<Boolean> c1 = boolean.class;
System.out.println("Here, the class name is: "+c1.getName());
Class<test> c2 = test.class;
System.out.println("This is another instance of class is used to derive class name : "+c2.getName());
}
}

輸出:

JAVA中的反射

說明:請檢查上面提供的範例。它有一個包,其中包含所有名為“test”的類別。測試包有一個“測試聲明”類別。該類別還包含 main 方法,程式將從該方法開始執行。類別“Class ”是jAVA中的識別碼反射類別。這個類別是在上面宣告的「java.lang.Class」函式庫的幫助下啟用的。 Boolean本身是JAVA中的一個類別。布林值是一種原始資料類型,如字串、整數或字元。這個例子說明我們可以提取原始資料類型的信息(最終是JAVA中的類,這也是JAVA被稱為純粹物件導向語言的原因)。 “getName()”函數用於取得名稱此處由名為“C1”的物件實例化的類別。

在下一行中,不使用原始資料類型,而是考慮使用名為「test」的使用者定義資料類型「class」來提取資料。 「類別」是一個用名為「C2」的物件實例化的反射類別。這裡測試類別名,並使用該物件使用函數「getName()」提取該類別的名稱。最終輸出包含這些函數的回傳值並顯示在輸出畫面上。

範例#2

代碼:

//package test;
import java.lang.Class;
class Simple{}
public class test{
public static void main(String args[]){
try{
Class<?> c=Class.<em>forName</em>("Simple");
System.<em>out</em>.println("The result is: "+c.isInterface());
}catch(Exception e){System.<em>out</em>.println(e);}
}
}

輸出:

JAVA中的反射

說明: 在上面的範例中,建立了一個名為「test」的套件,如前面範例 1 中所建立的。該套件包含一個類別名稱“Simple”,它不是主類別。這裡的主類別是「測試」類,它包含程式將從中開始執行的 main 方法。 「類別>」是反射類別的標識符,它是透過此處名為「c」的物件實例化的。然後,該物件用於提取名為「isInaterface」的函數的決策指示符(True 或 false)。此函數引入一個類別作為參數;在這種情況下,作為參數引入的類別是「Simple」類別。此類別不是接口,因此在輸出畫面中返回“false”作為結果。為了呼叫這個函數,使用了類別物件“c”。

優點

在JAVA中使用反射的一些優點如下:

  1. 這是提取任何類別資訊的最佳方法之一。這些資訊可以包含從建構函數到類別和方法的資訊。
  2. 此功能的最大優點之一是我們還可以提取有關私有方法和類別的資訊。因此,如果惡意隱藏在程式中,任何內容都可以使用此功能提取出來。
  3. 此功能為調試器提供了很大的靈活性,因為它們可以輕鬆調試類,而不是單獨調試每個類。
  4. 這也增加了一個可擴充性功能,可以透過使用實例來新增外部自訂類別。
  5. 這在實例的幫助下體現了 OOP 語言的真正力量。
  6. 這用於在程式運行期間動態載入和重新載入類別。

結論

JAVA反射使得在根本不知道類別名稱的情況下內省類別、介面、方法等成為可能。這一切都是在編譯時完成的。這被認為是 JAVA 最強大的屬性之一,因為它可以用來建立類別的實例,並且可以使用它來提取類別的私有成員。開發人員也可以在運行時使用它並進行資料庫物件映射。

以上是JAVA中的反射的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn