Java反射(Reflect)機制詳解

1.反射機制概念

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

2.應用場景

如果編譯時根本無法預知該對象和類屬於哪些類,程序只能依靠運行時信息來發現該對象
和類的真實信息,此時就必須使用到反射了。

3.反射相關的API

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

4.反射使用的步驟

  • 獲取要操作的類的Class對象。
  • 使用反射Api可獲取Class的構造方法、方法、屬性等。

5.獲取Class的有三種方法

  1. 調用某個對象的getClass()方法
Person p = new Person();
Class personClass = p.getClass();
  1. 調用某個類的 class 屬性來獲取該類對應的 Class 對象
Class personClass = Person.class;

3.使用 Class 類中的 forName()靜態方法(最安全/性能最好)

Class personClass = Class.forName("com.huang.reflect.Person");

示例:

Class personClass = Class.forName("com.huang.reflect.Person");
        //獲取Person中的所有屬性
        Field[] fields = personClass.getDeclaredFields();
        for (Field field : fields) {
            System.out.println("field--name=="+field.getName());
        }
        //獲取Person中的所有構造方法
        Constructor[] constructors = personClass.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            System.out.println("constructor--name=="+constructor.getName());
            //獲取構造方法中的參數
            Parameter[] parameters = constructor.getParameters();
            for (Parameter parameter : parameters) {
                System.out.println("constructor--"+constructor.getName()+"--parameter--"+parameter.toString());
            }
        }
        //獲取Person中的所有方法
        Method[] methods = personClass.getDeclaredMethods();
        for (Method method : methods) {

            System.out.println(method.toString());
            Parameter[] parameters = method.getParameters();
            for (Parameter parameter : parameters) {
                System.out.println("method--"+method.getName()+"--parameter--"+parameter.toString());
            }
        }

注:getDeclaredX是獲取當前Class中申明的所有X,getX是獲取當前Class以及父類或者接口定義的public的x

6.創建對象的兩種方法

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

  Class personClass = Class.forName("com.huang.reflect.Person");
  //1.使用newInstance方法創建對象,空的構造方法
  Person p = (Person) personClass.newInstance();
        
   //2.使用構造方法創建對象
   Constructor c = personClass.getDeclaredConstructor(String.class,int.class,String.class);
  Person p1 = (Person) c.newInstance("xiaohong",20,"女");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章