JAVA反射機制

JAVA Reflection

Reflection是被視爲動態語言的關鍵,反射機制允許程序在執行期藉助於Reflection API取得任何類的內部信息,並能直接操作任意對象的內部屬性及方法

JAVA反射機制提供的功能:

在運行時判斷任意一個對象所屬的類

在運行時構造任意一個類的對象

在運行時判斷任意一個類所具有的成員變量和方法

在運行時調用任意一個對象的成員變量和方法

生成動態代理

1.理解Class類並實例化Class類對象

  

2.運行時創建類對象並獲取類的完整結構

3.通過反射調用類的指定方法、指定屬性

4.動態代理

反射相關的API:

 java.lang.Class : 代表一個類

java.lang.reflect.Method:代表類的方法

java.lang.reflect.Field :代表類的成員變量

java.lang.reflect.Constructor:代表類的構造方法

代碼:

Person類:

package reflect;

public class Person {
    public String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void show(){
        System.out.println("我是一箇中國人");
    }
    public void display(String national){
        System.out.println("我的國家是" + national);
    }
}

測試類:

package reflect;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Main {
    
    public static void main(String[] args) throws Exception {
        /*
         * 面向對象的思想創建對象併爲屬性賦值
         * */
        System.out.println("面向對象的思想創建對象併爲屬性賦值");
        Person person = new Person();
        person.setName("張蕾");
        person.setAge(20);
        System.out.println(person);
        person.show();
        person.display("中國");
        System.out.println("***********************");
        /*
         * 通過反射實現,通過反射創建一個類的對象,並調用其中的結構
         * */
        //1.創建classPerson運行時類Person類的對象
        Class<Person> classPerson = Person.class;
        Person p = (Person)classPerson.newInstance();
        System.out.println("反射的" + p);
        //2.通過反射調用運行時類的指定的屬性
        Field f1 = classPerson.getField("name");//此時要把name屬性public的
        f1.set(p, "ZhangLei");
        System.out.println("通過反射添加public的name屬性後的Person對象:" + p);
        Field f2 = classPerson.getDeclaredField("age");//此時要把name屬性public的
        //getDeclaredField("age")是暴力反射
        f2.setAccessible(true);//加上這句就不會報錯:java.lang.IllegalAccessException
        f2.set(p, 22);
        System.out.println("通過反射添加private的age屬性後的Person對象:" + p);
        //3.通過反射調用運行時類的指定的方法
        Method m1 = classPerson.getMethod("show");//第一個參數是要調用的方法的名稱,第二個參數是形參的類型的類,沒有就不寫
        m1.invoke(p);//第一個參數是對象,第二個參數是方法的實參,沒有就不寫
        Method m2 = classPerson.getMethod("display", String.class);
        m2.invoke(p,"China");
    }
    
}
測試結果:

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