A reflexão Java obtém valores variáveis da subclasse / obtém instância do objeto do campo membro
Digamos que eu tenha uma classe que tenha algumas variáveis de membro uma ou mais, sendo outra classe também com variáveis de membro. Como posso obter o valor de cada variável nas duas classes?
Eu posso obter as variáveis chamando:getDeclaredFields();
E os valores do objeto Foo chamandofield.get(obj)
iterando-os novamente para obter as variáveis de subclasse.
Mas como posso obter o valor para cada variável de membro de subclasse sem uma instância dessa classe? Meu exemplo trivial funciona porque as variáveis são as mesmas para cada instância doBar
aula e eu posso ligarinnerField.get(new Bar())
Eu acho que poderia funcionar se eu pudesse de alguma forma obter a instância do objeto do campo?
desde já, obrigado
Primeiro Objeto:
public class Foo {
public Foo(){}
private Integer someInt = 123;
private Long someLong = 987654321L;
private String someString = "qwertyuiop";
private Bar bar = new Bar();
}
Segundo objeto:
public class Bar {
public Bar(){}
private Double someDouble = 123.456;
private String innerString = "another String";
}
método principal / de chamada:
public static void main(String[] args) throws Exception {
Foo foo = new Foo();
getMemberFields(foo);
}
Obtendo variáveis e valores:
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()));
}
}
}
}
Resultado
obj: class Foo
Field: someInt value: 123
Field: someLong value: 987654321
Field: someString value: qwertyuiop
Field: bar value: Bar@61bbe9ba
Sub Field: someDouble
Sub Field value: 123.456
Sub Field: innerString
Sub Field value: another String