我有一个类,它有几个字段,是另一个类的子类。我想在顶级类中快速找到该子类的所有实例。
例如
public class TopClass {
private ClassIWant1 myVar1;
private ClassIWant2 myVar2;
private OtherJunk myVar3;
private Nested myVar4;
}
public class Nested {
private ClassIWant3 myVar11;
}
public class SuperClass {
}
public ClassIWant1 extends SuperClass {}
public ClassIWant2 extends SuperClass {}
public ClassIWant3 extends ClassIWant1 {}
如果我使用TopClass
的实例运行该示例,我希望得到一个包含myVar1,myVar2和myVar11值的List。
我对如何使用反射手动执行此操作有一个大概的想法,但我希望我不必重新发明轮子。有没有可以做到这一点的图书馆?
我熟悉ReflectUtils,但我不确定是否可以这样做。
答案 0 :(得分:1)
如果我理解你的要求,你正在寻找类似的东西:
public class Test {
public static void main(String[] args) {
TopClass top = …; // initialise as appropriate
System.out.println(findFields(top, SuperClass.class));
}
private static <T> List<T> findFields(Object haystack, Class<T> needle) {
return findFields0(haystack, needle, new HashSet<Object>(), new ArrayList<T>());
}
private static <T> List<T> findFields0(Object haystack, Class<T> needle, Set<Object> visited, List<T> result) {
if (visited.contains(haystack)) return result; // we already searched this object
visited.add(haystack);
for (Field field : haystack.getClass().getFields()) {
field.setAccessible(true);
Object fieldValue = null;
try {
fieldValue = field.get(haystack);
} catch (IllegalAccessException e) {
// shouldn't happen
throw new RuntimeException(e);
}
if (needle.isAssignableFrom(field.getType())) {
result.add(needle.cast(fieldValue));
}
// recurse
findFields0(fieldValue, needle, visited, result);
}
return result;
}
}
这通过使用声明的字段的静态类型来工作。也就是说,如果您将某个字段声明为Object
但它包含SuperClass
或其后代之一的实例,则无法找到该字段。如果字段将它们设置为值,它也将返回null
s。我不知道这会对原始类型做些什么。
免责声明:代码在一个乐观的例子中进行了简要测试,如果它导致您的计算机着火,我不承担任何责任。
答案 1 :(得分:-1)
this method您要找的是什么?