[Java基礎]反射

Duancf發表於2024-07-09

反射

獲取任意物件的資料

對物件一無所知的情況下

public class Student {
    
    private String name;
    private Integer age;

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}



import java.lang.reflect.Field;

public class Main {
    public static void main(String[] args) throws IllegalAccessException {
        
        Student student = new Student("段昌峰", 25);

        // 在未知物件情況的條件下,讀出物件的所有資料
        // 獲取class類物件,這個物件中儲存了關於student物件的所有資訊
        Class<? extends Student> aClass = student.getClass();
        // 獲取class物件中的所有成員變數
        Field[] fields = aClass.getDeclaredFields();
        // 遍歷成員變數,首先把成員變數的可訪問性改為true
        // 然後,透過getname和get方法獲取成員變數的名稱和值
        for (Field field : fields) {
            field.setAccessible(true);
            System.out.println(field.getName()+"="+field.get(student));
        }
    }
}

透過配置檔案,建立物件並且呼叫方法

首先編寫配置檔案

className=Teacher
methodName=teach

其次編寫bean類

public class Teacher {
    public Teacher() {
    }

    public void teach(){
        System.out.println("老師正在教學");
    }
}

最後編寫main函式中的方法

//讀取配置檔案
Properties p = new Properties();
FileInputStream fi = new FileInputStream("./pros.properties");
p.load(fi);
String className = (String) p.get("className");
String methodName = (String) p.get("methodName");

//首先根據全類名獲得class物件
Class<?> aClass = Class.forName(className);
//獲得構造方法
//並使用構造方法newinstance生成物件
Constructor<?> constructor = aClass.getDeclaredConstructor();
Object o = constructor.newInstance();
//獲得物件的對應方法
Method declaredMethod = aClass.getDeclaredMethod(methodName);
//透過invoke執行對應的方法
//invoke方法的引數列表分別是呼叫這個方法的物件和傳入的引數
declaredMethod.invoke(o);

以上程式碼可以實現根據配置檔案中的兩個字串,我們就可以生成這個物件,並且執行物件中的某個方法,以後我們就可以透過簡單的更改配置檔案來生成另一個物件,執行另一個方法。

相關文章