Java筆記-反射機制Reflection API(java動態機制)基礎

原則上java不是動態語言的範疇,比如python PHP。但是反射機制的出現使得java在一定意義上實現了動態語言的特徵的。通過反射機制的API可以動態的獲取運行時的類的內部信息或者類的結構信息。並且能夠操作類的實例的對象和方法。

Java反射機制提供如下的功能:
1.在運行時判斷任意一個對象的所屬的類。
2.在運行時創建任何一個類的對象實例。
3.運行時獲取任意一個類的所有的屬性和方法(包括私有屬性和方法)。
4在運行時調用和操作任意類的屬性和方法。

下面是我的運行demo:
首先新建一個person類

package TestReflection;
/**
* @author 善水 E mail:[email protected]
* @version 創建時間:Nov 1, 2017 10:14:50 PM
* 類說明
*/
public class Person {
    public String name = "王雲";
    public int age = 22;
    private String sex = "男士";
    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 String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }

    public Person(String name, int age, String sex) {
        super();
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    public Person() {
        super();
        // TODO Auto-generated constructor stub
    }


    public void show() {
        System.out.println("我叫"+name+",我是一個"+sex+",今年"+age+"歲 了.");

    }

    public void display() {

        System.out.println("我是一個人!");
    }

public void display1(String nation) {

        System.out.println("我是一個"+nation+"人");


    }
}

後面是
反射測試代碼:

package TestReflection;
/**
* @author 善水 E mail:[email protected]
* @version 創建時間:Nov 1, 2017 10:18:12 PM
* 類說明
*/

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


import org.junit.Test;

public class TestRelf {

//  在不使用反射機制之前的面向對象的基本類操作
    @Test
    public void  test1(){
        Person  p1 = new Person();
        p1.setName("劉德華");
        p1.setAge(45);
        p1.setSex("男士");

        p1.display();
        p1.show();
    }

//  使用java的反射機制實現對運行時類的操作
    @Test
    public void test2() throws Exception {
        Class<Person> pClass = Person.class;
//      創建類的實例
        Person person = pClass.newInstance();
//      獲取屬性
        Field fname = pClass.getField("name");
        fname.set(person, "周星馳");

        Field fage = pClass.getField("age");
        fage.set(person, 55);

        Method method1 = pClass.getMethod("display1", String.class);
        method1.invoke(person, "HK");

        Method method2 = pClass.getMethod("setName", String.class);
        method2.invoke(person, "張學友");

//      重點:與封裝性的原則對立,private的屬性獲取
//
//      Field fsex = pClass.getField("sex");錯誤:因爲聲明 的是私有變量
//      fsex.set(person, "nanshi");
//      以下的就會運行成功
        Field fsex = pClass.getDeclaredField("sex");
        fsex.setAccessible(true);
        fsex.set(person, "女士");
        person.show();
//      person.display();
    }

}

以上就是反射機制的最基本問題,後面的很多操作都基於這一思想的實現。在上面的例子中需要注意反射機制對類私有屬性和方法的操作。這與面向對象所學的封裝性有一點出入。

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