1. 程式人生 > >反射如何取得變數和變數的值 從引數object中取值

反射如何取得變數和變數的值 從引數object中取值

今天寫專案用到了pdf的生成需要從Object中取得傳的值填寫到pdf中 最後決定使用反射

 

 

新增測試類

public class User {
    private Integer id;
    private String name;

    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }
    //省略set get 方法
}
public class Student {
    private Integer id;
    private String name;
    private Integer age;

    public Student(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    //省略set get 方法
}

 

 

1.  如何實現取得所有的值 程式碼中 getValues(Object object) 這個方法是反射取值的實現

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String[] args) throws IllegalAccessException {
        User user = new User(1,"張三");
        Student student = new Student(1,"李四",18);
        // 呼叫業務 需要在method中使用傳入引數的值 然而這個傳入的物件可能不同
        // 在該情況下可以使用反射

        System.out.println("傳入User");
        method(user);
        System.out.println("傳入Student");
        method(student);
    }
    // 模擬業務的方法
    // 因為傳入的物件不確定 需要用到Object來接收
    public static void method(Object obj) throws IllegalAccessException {
        List<String> values = getValues(obj);
        // 模擬需要用到引數中屬性的值
        System.out.println(values);
    }

    //把傳入的引數的值全部取出
    public static List<String> getValues(Object object) throws IllegalAccessException {
        Class clz = object.getClass();
        Field[] field = clz.getDeclaredFields();
        List<String> values = new ArrayList<>();
        for (Field f : field) {
            f.setAccessible(true);
            String value = String.valueOf(f.get(object));
            values.add(value);
        }
        return values;
    }
}

        核心程式碼 

        

執行結果

 

2. 如何取得欄位呢 

public static List<String> getNames(Object object){
    Class clz = object.getClass();
    Field[] field = clz.getDeclaredFields();
    List<String> names = new ArrayList<>();
    for (Field f : field) {
        String name = f.getName();
        names.add(name);
    }
    return names;
}

        核心程式碼 

        

結果

 

如果 屬性的值都需要 可以兩者結合