反射如何取得變數和變數的值 從引數object中取值
阿新 • • 發佈:2018-11-18
今天寫專案用到了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; }
核心程式碼
結果
如果 屬性的值都需要 可以兩者結合