1. 程式人生 > >java反射系列一

java反射系列一

ESS 內部 override ref todo 動態語言 port 傳參 col

一.概念認知 1.1 ●Java Reflection
Reflection (反射)是被視為動態語言的關鍵, 反射機制允許程序在執行期借助於Reflection API取得任何類的內部信息, 並能直接操作任意對象的內部屬性及方法

1.2 ●Java反射機制提供的功能
?在運行時判斷任意一 個對象所屬的類 ?在運行時構造任意-個類的對象
?在運行時判斷任意一個類所具有的成員變量和方法 ?在運行時調用任意個對象的成員變量和方法 ?生成動態代理 1.3 Java反射機制研究及應用
●反射相關的主要API: ?java.lang.Class:代表一 個類
?java.lang.reflect,Method:代表 類的方法 ?java.lang.reflect.Field:代表 類的成員變量
?java.lang.reflect.Constructor:代表 類的構造方法
二.代碼示例
package reflect;

public class Person {
    public String name;
    private int age;
    public Person() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Person(String name, int age) {
        
super(); this.name = name; this.age = 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 nation) { System.out.println("我的國籍是: "+nation); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }

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

public class TestReflection {
    public static void main(String[] args) throws Exception {
        TestReflection t = new TestReflection();
        t.test2();
    }
     //反射思想.創建一個類的對象.並調用其中的結構
    public void test2() throws Exception {
        //此代碼指向Person類,其所有屬性.方法均暴露
        ①Class clazz = Person.class;
        
        /*
         * 1.創建clazz對應的運行時類Person類的對象
         * public T newInstance()
              throws InstantiationException,
                     IllegalAccessException創建由此類對象表示的類的新實例。 
         */
        ②Person p = (Person)clazz.newInstance();
        System.out.println(p);
        /*
         * getField(String name) 
         * 返回一個 Field對象,它反映此表示的類或接口的指定公共成員字段 類對象。 
         */
        ③Field f1 = clazz.getField("name");
        /*
         * set(Object obj, Object value) 
         * 將指定對象參數上的此 Field對象表示的字段設置為指定的新值。
         */
        ④f1.set(p, "巫妖果子");
        System.out.println(p);
        /*
         * 2.私有屬性
         * getDeclaredField(String name) 返回一個 Field對象,
         * 它反映此表示的類或接口的指定已聲明字段 類對象。
         */
        ⑤Field f2 = clazz.getDeclaredField("age");
        ⑥f2.setAccessible(true);
        f2.set(p, 20);
        System.out.println(p);
        
        /*
         * 3.通過反射調用運行時類的指定的方法
         *getMethods() 返回包含一個數組 方法對象反射由此表示的類或接口的所有公共方法 類對象,
         *包括那些由類或接口和那些從超類和超接口繼承的聲明
         */
        ⑦Method m1 = clazz.getMethod("display", String.class);
        /*
         * invoke(Object obj, Object... args) 
         * 在具有指定參數的 方法對象上調用此 方法對象表示的底層方法。
         */
        ⑧m1.invoke(p, "中國");
        
        ⑨Method m2 = clazz.getMethod("show");
        m2.invoke(p);
    }
    
    //面向對象的思想.創建一個類的對象,並調用其中的方法.屬性
    public void test1(){
        Person p = new Person();
        p.setAge(20);
        p.setName("巫妖果子");
        System.out.println(p);
        p.show();
        p.display("中國");
    }
}

程序分析:①②處相當於面向對象的

Person p = new Person();
這行代碼,創建實例

③處是指定Person中的屬性(公共權限)④處設置屬性值⑤處由於age屬性的權限是私有的,所以

getDeclaredField("age")

起聲明作用⑥僅僅是這樣還不足以設置私有屬性,故有此行代碼⑦處指定有參方法⑧處傳參

⑨處是無參方法
技術分享圖片

 

java反射系列一