3
說我有一個類,有一個或多個成員變量是另一個類也與成員變量。我怎樣才能得到兩個類中的每個變量的值?Java反射得到子類變量值/從成員字段獲取對象實例
我可以通過調用getDeclaredFields();
來獲得變量,然後通過調用field.get(obj)
再次迭代它們來獲取子類變量。
但是我怎樣才能得到每個子類成員變量的值沒有該類的實例? 我簡單的例子工作,因爲變量是爲Bar
類的每個實例一樣,我可以叫innerField.get(new Bar())
我想,如果我能以某種方式得到從外地對象的實例它可以工作?
預先感謝
第一對象物:
public class Foo {
public Foo(){}
private Integer someInt = 123;
private Long someLong = 987654321L;
private String someString = "qwertyuiop";
private Bar bar = new Bar();
}
第二目的:
public class Bar {
public Bar(){}
private Double someDouble = 123.456;
private String innerString = "another String";
}
主/主叫方法:
public static void main(String[] args) throws Exception {
Foo foo = new Foo();
getMemberFields(foo);
}
獲取變量和值:
public static void getMemberFields(Object obj) throws IllegalAccessException, NoSuchFieldException {
Class<?> objClass = obj.getClass();
System.out.println("obj: " + obj.getClass());
Field[] fields = objClass.getDeclaredFields();
for(Field field : fields) {
field.setAccessible(true);
System.out.println("Field: " + field.getName() + " value: " + field.get(obj));
Field[] innerFields = {};
if (!field.getType().getName().contains("java.lang")) {
innerFields = field.getType().getDeclaredFields();
}
for (Field innerField: innerFields) {
if (!innerField.getName().contains("java.lang")) {
Object subObj = field.getType();
innerField.setAccessible(true);
System.out.println("");
System.out.println("Sub Field: " + innerField.getName());
System.out.println("Sub Field value: " + innerField.get(new Bar()));
}
}
}
}
輸出
obj: class Foo
Field: someInt value: 123
Field: someLong value: 987654321
Field: someString value: qwertyuiop
Field: bar value: [email protected]
Sub Field: someDouble
Sub Field value: 123.456
Sub Field: innerString
Sub Field value: another String