反射獲取屬性,構造器以及方法

反射

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

測試

ReflectDemo.java(實體類)

package Reflect;

public class ReflectDemo {

    private String res;

    public ReflectDemo() {
        System.out.println("public無參構造方法");
    }

    private ReflectDemo(String str) {
        System.out.println("private有參構造方法:" + str);
    }

    public void say(String name) {
        System.out.println("public有參方法:" + name);
    }

    private String hi() {
        return "private無參方法:" + res;
    }
}

ReflectTest.java(main)

package Reflect;

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

public class ReflectTest {

    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException {
        //獲取ReflectDemo類
        Class rd = ReflectDemo.class;
        //實例化ReflectDemo,默認會調用public無參構造器
        ReflectDemo reflectDemo = (ReflectDemo) rd.newInstance();

        //獲得private有參構造器,傳入參數類型
        Constructor constructor = rd.getDeclaredConstructor(java.lang.String.class);
        //設置權限(可以訪問private)
        constructor.setAccessible(true);
        //使用private有參構造器實例化對象,調用private有參構造器
        reflectDemo = (ReflectDemo) constructor.newInstance("welcome");

        //獲得public有參方法,傳入方法名say以及參數類型String
        Method methodPublic = rd.getDeclaredMethod("say", java.lang.String.class);
        //調用say方法,傳入reflectDemo對象以及參數值
        methodPublic.invoke(reflectDemo, "hello");

        //獲得private無參方法,傳入方法名hi
        Method methodPrivate = rd.getDeclaredMethod("hi");
        //設置權限(可以訪問private)
        methodPrivate.setAccessible(true);
        //調用hi方法,傳入reflectDemo對象
        String strnull = (String) methodPrivate.invoke(reflectDemo);
        //由於ReflectDemo類中res屬性未賦值,所以會輸出null
        System.out.println(strnull);

        //獲取private屬性res,傳入屬性名res
        Field field = rd.getDeclaredField("res");
        //設置權限(可以訪問private)
        field.setAccessible(true);
        //設置res屬性值
        field.set(reflectDemo, "world");
        //調用hi方法,傳入reflectDemo對象
        String str = (String) methodPrivate.invoke(reflectDemo);
        //此時res屬性已賦值
        System.out.println(str);
    }
}

運行結果
在這裏插入圖片描述

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