簡介
java中的反射是一種應用程序編程接口(API),用於在運行時檢查或修改接口、方法和類的行為。
java。朗。類提供了許多不同的方法,可用於元數據、檢查和改變接口、方法、類在運行時的行為。java。Lang和java。朗。反射包為反射提供所需的類。
反射應用程序編程接口(API)主要使用:
- IDE(集成開發環境),如MyEclipse, Eclipse, NetBeans等。
- 調試器
- 測試工具等等。
在反射的幫助下,我們可以在運行時調用方法,而不管它們中使用的訪問說明符。
圖:Java中的反射
反射可以用來獲得以下信息:
- 類:要知道該特定對象所屬的類的名稱,可以使用getClass()方法。
- 構造函數:要了解特定對象所屬類的公共構造函數,可以使用getConstructors()方法。
- 方法:要了解特定對象所屬類的公共方法,可以使用getMethods()方法。
看看
Java類的反射
- 使用forName()方法:此方法用於動態加載類並返回class類的實例。forName()方法不能用於基本類型。
例子:
class Animal {} class Dog {public static void main (String args[]) {class a = class。forName(“動物”);System.out.println (a.getName());}}
輸出:
動物
- 使用getClass()方法:此方法用於返回Class類的實例。如果您知道tyoe,則使用getClass()方法,它也可以用於基本類型。
例子:
類動物{}類狗{無效printName(對象obj){類b = obj. getclass ();System.out.println (b.getName());} public static void main (String args[]) {Animal s = new Animal();狗=新狗();t.printName (s);}}
輸出:
動物
- 使用.class擴展名:在java中,如果類型可用但沒有實例,那麼我們可以通過在類型名後麵附加“. Class”來獲取Class。此方法對於基元數據類型也很有用。
例子:
class Dog {public static void main (String args[]) {class c1 = boolean.class;System.out.println (c1.getName());Class c2 = Dog.class;System.out.println (c2.getName());}}
輸出:
布爾
動物
Java類反射示例
在這個例子中,有一個超類“Animal”和一個子類“Cat”。在這裏,我們試圖檢查類“Cat”。
進口. lang . class;進口數組;*;class Animal{} //將這個類放在不同的Cat.java文件中,public class Cat extends Animal {public void display () {System.out.println ("It 's a Cat.");}} //把這個放在Main.java文件類Main {public static void Main (String[] args) {try{//創建一個Cat對象Cat a1 = new Cat();//創建Class的對象//使用getClass() Class obj = a1.getClass();String name = obj.getName();System.out.println ("Name: " + Name);//獲取類的訪問修飾符int modifier = obj.getModifiers();//將訪問修飾符轉換為字符串字符串mod =修飾符。toString(修飾符);System.out.println ("Modifier: " + mod); // get the superclass of Cat Class superClass = obj.getSuperclass(); System.out.println ( "Superclass : " + superClass.getName() ); } catch ( Exception e ) { e.printStackTrace(); } } }
輸出:
姓名:貓
修飾符:public
超類:動物
在上麵的例子中,語句:Class obj = a1.getClass();
在這條語句中,我們試圖使用方法“getClass()”創建一個“Class”的對象“obj”。在對象的幫助下,可以調用“Class”的不同方法。
- obj.getName ():此方法用於返回類的名稱。
- obj.getModifiers ():此方法用於返回類的訪問修飾符。
- obj.getSuperclass ():此方法用於返回類的超類。
反射構造函數,方法和字段
在java中,我們可以使用java反射來檢查對象的類、方法和字段的構造函數。這可以通過使用包java.lang.reflect來完成,該包提供了可用於操作類成員的類。
- 類構造函數它用於給出類中構造函數的信息。
- 方法類:它用於給出類中方法的信息。
- 領域類別:它用於給出類中字段的信息。
- Java中構造函數的反射
在Java中,我們可以使用Constructor類提供的不同方法檢查各種構造函數。這可以通過java.lang.reflect.Constructor類輕鬆完成。
例子:
在這個例子中,有兩個構造函數,每個構造函數的類名為“Bird”。
進口. lang . class;進口數組;*;class Bird{//定義不帶參數的公共構造函數public Bird(){} //定義帶有單個參數的私有構造函數private Bird (int age) {}} class Main{公共靜態void Main (String[] args) {try{//創建一個Bird對象Bird a1 = new Bird ();//通過getClass()創建Class的對象Class obj = a1.getClass();//獲取Bird Constructor的所有構造函數[]constructors = obj.getDeclaredConstructors();for(構造函數b:構造函數){//獲取構造函數的名稱System.out.println("構造函數名稱:" + b. getname ()));//獲取構造函數的訪問修飾符//將其轉換為字符串形式int modifier = b.getModifiers();字符串mod =修飾符。toString(修飾符);System.out.println ("Modifier: " + b.getModifiers()); // getting the number of parameters in constructors System.out.println ( "Parameters : " + b.getParameterCount() ); System.out.println (""); } } catch ( Exception e ) { e.printStackTrace (); } } }
輸出:
施工名稱:Bird
修飾符:public
參數:0
施工名稱:Bird
修飾符:private
參數:1
在上麵的例子中,語句:Constructor[] constructors = obj.getDeclaredConstructors();我們可以訪問Bird類中的所有構造函數,並將它們分配到constructor類型的構造函數數組中。
為了獲取構造函數的信息,我們使用對象' b '。
- b.getName ():返回構造函數的名稱。
- b.getModifiers ():用於返回構造函數的訪問修飾符。
- b.getParameterCount ():用於返回每個構造函數中傳遞的參數數量。
- Java中方法的反映
要獲得關於類中出現的不同方法的信息,可以使用提供各種方法的Method類。
例子:
在這個例子中,我們試圖獲得“Bird”類中方法的所有信息。
進口. lang . class;進口數組;*;class Bird{//類的public void方法display() {System.out.println ("It 's a Bird.");} private void類型(){System.out.println (" sparrow");}} class Main {public static void Main (String args[]) {try{//創建一個Bird對象Bird d1 = new Bird ();//使用getClass()創建Class的對象Class obj = d1.getClass();//使用Class的對象獲取Bird Method的所有聲明方法[]methods = obj.getDeclaredMethods();//創建Method類的對象(Method c: methods){//獲取方法的名稱System.out.println ("Method Name: " + c. getname ());//獲取方法的訪問修飾符int modifier = m.g tmodifiers ();system . out。println( "Modifier : " + Modifier.toString(modifier) ); // getting the return types of method System.out.println ( "Return Type : " + c.getReturnType() ); System.out.println (" "); } } catch ( Exception e ) { e.printStackTrace(); } } }
輸出:
方法名稱:display
修飾符:public
返回類型:void
方法名稱:type
修飾符:private
返回類型:void
表達式Method[] methods = obj.getDeclaredMethods();返回類中出現的所有方法。
為了獲取構造函數的信息,我們使用對象' c '。
- c.getName ():它返回方法的名稱。
- c.getModifiers ():用於返回方法的訪問修飾符。
- c.getReturnType ():它用於返回方法的類型。
- Java中字段的反射
使用字段類的方法,我們還可以檢查和修改類的各個字段。
例子:
在這個例子中,我們有一個名為“Bird”的類,它有一個公共字段名為“type”。
進口. lang . class;進口數組;*;類鳥{公共字符串類型;} class Main {public static void Main (String args[]) {try{//創建一個Dog Bird對象d1 = new Bird ();//使用getClass()創建Class的對象Class obj = d1.getClass();//訪問並設置類型field field field1 = obj. //getField ("type");field1。集合(d1,“麻雀”);//獲取字段類型值String typeValue = (String) field1.get(d1);System.out.println ("Value: " + typeValue); // getting the access modifier of the field type int mod = field1.getModifiers(); // convert the modifier to String form String modifier1 = Modifier.toString (mod); System.out.println ( "Modifier : " + modifier1 ); System.out.println (" "); } catch (Exception e) { e.printStackTrace(); } } }
輸出:
值:麻雀
修飾符:public
表達式Field field1 = obj。getField (" type ");正在訪問“Bird”類的公共字段,並將該值分配給“field”類的對象“field1”。
為了獲取構造函數的信息,我們使用對象' field1 '。
- field1。設置():用於設置字段的值。
- field1.getModifiers ():以整數形式返回字段的值。
- field1。Get ():它用於返回字段的值。
Reflectio的優點n
在Java,反射是有幫助的,因為它有助於按名稱動態檢索類和數據結構的信息。它還允許在執行程序中對它們進行操作。這是一個非常強大的特性,是其他傳統語言(如Pascal、C、Fortran或c++)所不具備的。
Java Reflection API有助於在運行時檢查接口、方法和類,而無需在編譯時了解它們的內部信息。