java - 有没有一个库可以给我一个类在另一个类中出现的所有实例?

标签 java reflection

我有一个类,其中有几个字段是另一个类的子类。我想在顶级类中快速找到该子类的所有实例。

例如

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 值的列表。

我对如何使用反射手动执行此操作有一个大致的了解,但我希望我不必重新发明轮子。有图书馆可以做到这一点吗?

我熟悉ReflectUtils , 但我不确定是否可以做到这一点。

最佳答案

如果我没有正确理解你的请求,你正在寻找这样的东西:

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。我不知道这会对原始类型做什么。

免责声明:代码已在一个乐观示例上进行了简短测试,如果它导致您的计算机着火,我不承担任何责任。

关于java - 有没有一个库可以给我一个类在另一个类中出现的所有实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9088600/

相关文章:

java - 修复后覆盖未调用的绘制方法

java - 反序列化时动态绑定(bind)JsonProperty

java - 从 ListView 单击获取自定义对象

java - CXF 3.0.4 SOAP客户端拦截器传递参数

java - 二叉树的 hasPathSum() 实现

C# Type.GetMethods() 不返回 Main() 方法

java - 反射:通过反射加载的类中的常量变量

java - 通用对象创建方法的返回类型

java - 返回 Class.forName 而不是新实例

java - 从 Collection/Map 获取参数化数组