學習java的反射

java中的反射機制

  • 定義
      JAVA反射機制是在運行狀態中,對於任意一個類,都能夠獲取這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱爲java語言的反射機制。
      JAVA反射(放射)機制:“程序運行時,允許改變程序結構或變量類型,這種語言稱爲動態語言”。
  • 功能
     1.在運行時判斷任意一個對象所屬的類
     2.在運行時構造任意一個類的對象
     3.在運行時判斷任意一個類所具有的成員變量和方法
     4.在運行是獲取泛型信息
     5.在運行時調運任意一個對象的成員變量和方法
     6.在運行時處理註解
     7.生成動態代理

java反射字節碼對象方式:

方法 示例
對象名.getClass() stu.getClass();(前提條件是必須對象存在)
類名.class Student.class
Class.forName(“包名.類名”) Class.forName(“util.Student”)

Class 類的方法

方法 功能
newInstance() 創建此類的對象(實例化的類一定有無參數的構造函數,否則不能被實例化)
getField(String name) 返回此類的或者接口指定name的公共屬性(返回值爲Field類型)
getFields() 返回此類的或者接口所有的公共屬性(返回值爲Field類型的數組)
getMethod(String name, 類<?>… parameterTypes) 返回此類的或者接口指定name,指定參數的公共方法(返回值爲Method類型)
getMethods() 返回此類的或者接口所有的公共方法(返回值爲Method類型的數組)
getDeclaredField(String name) 返回此類的或者接口指定name的所有屬性(返回值爲Field類型)
getDeclaredFields() 返回此類的或者接口所有的屬性(返回值爲Field類型的數組)
getDeclaredMethod(String name, 類<?>… parameterTypes) 返回此類的或者接口指定name,指定參數的所有方法,parameterTypes參數的寫法爲:參數類型.class(返回值爲Method類型)
getDeclaredMethods() 返回此類的或者接口所有的方法(返回值爲Method類型的數組)

Filed類的方法

方法 功能
equals(Object obj) 將此 Field與指定對象進行比較
get(Object obj) 返回該表示的屬性的值(返回值爲Object,參數obj爲指定的該對象)
setAccessible(boolean boo) 此方法爲父類AccessibleObject的方法,賦予操作對象私有屬性的權限,參數true爲是,false爲否
set(Object obj, Object value) obj爲指定的該對象,方法的作用是設置該表示屬性的值爲value

Method類中的方法

方法 功能
equals(Object obj) 將此 方法與指定對象進行比較
getName() 返回該方法的名字(返回值爲String)
invoke(Object obj, Object… args) 執行此方法,obj爲指定該對象,args爲需要的參數,

舉例

Student類

public class Student {
    private String name;
    private int num;

    public Student(){

    }

    public Student(String name, int num) {
        this.name = name;
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", num=" + num +
                '}';
    }
    
    public void play(int a){
        System.out.println("輸出參數爲"+a+"的方法");
    }
}

Class,Filed,Method某些方法的測試

public class text {
    public static void main(String[] args) {
        try {
            //根據反射創建Class對象
            Class cls = Student.class;
            //創建類Student的對象stu
            Student stu = (Student) cls.newInstance();
            //獲取指定名字的私有屬性
            Field field = cls.getDeclaredField("name");
            Field field1 = cls.getDeclaredField("num");
            //設置操作私有屬性的權利
            field.setAccessible(true);
            field1.setAccessible(true);
            //設置私有屬性的值
            field.set(stu,"張三");
            field1.set(stu,1);
            //獲取指定名字的方法,及形參的寫法
            Method method =  cls.getDeclaredMethod("toString",null);
            Method method1 = cls.getDeclaredMethod("play", int.class);
            //執行方法,參數爲執行方法的對象
            System.out.println(method.invoke(stu));
            //執行方法,參數爲執行方法的對象,及該方法需要的參數
            method1.invoke(stu,666);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注:類中的方法只寫了一些部分方法,日後有需要,即使補充。

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