如何在java中的类的派生类中查找字段?

如何在java中的类的派生类中查找字段?,java,reflection,Java,Reflection,我问这个问题是因为我好奇。我不想实际遍历类的派生类。我知道我在这里介绍的方法是草率的,这只是一个测试 假设我有一个类(抽象或非抽象): 我可以很容易地编写一个方法来遍历类层次结构并查找字段,例如: private Field extractField(Class<?> type, String fieldName) { Field ret = null; try { ret = type.getDeclaredField

我问这个问题是因为我好奇。我不想实际遍历类的派生类。我知道我在这里介绍的方法是草率的,这只是一个测试

假设我有一个类(抽象或非抽象):

我可以很容易地编写一个方法来遍历类层次结构并查找
字段
,例如:

    private Field extractField(Class<?> type, String fieldName) {
        Field ret = null;
        try {
            ret = type.getDeclaredField(fieldName);
        } catch (NoSuchFieldException e) {
            Class<?> superclass = type.getSuperclass();
            if (superclass == null) {
                throw new IllegalArgumentException("Missing field detected.", e);
            } else {
                ret = extractField(superclass, fieldName);
            }
        }
        return ret;
    }
private字段extractField(类类型,字符串字段名){
字段ret=null;
试一试{
ret=type.getDeclaredField(fieldName);
}捕获(无此字段例外){
Class superclass=type.getSuperclass();
if(超类==null){
抛出新的IllegalArgumentException(“检测到缺少字段)”,e);
}否则{
ret=提取字段(超类,字段名);
}
}
返回ret;
}

现在,如果我希望在
类型
的派生类中搜索
字段
,我该怎么办?我在java反射包中没有发现任何有用的东西。

遍历派生类没有简单的方法,因为您不知道哪些类是从基类派生的。您可以使用该库查找派生类。这是通过检查类路径中类的字节码来实现的,可以选择限制为包或预索引

现在,如果我希望在类型的派生类中搜索字段,我该怎么办


一旦找到派生类,您就可以用同样的方法检查它们。

遍历派生类没有简单的方法,因为您不知道哪些类是从基类派生的。您可以使用该库查找派生类。这是通过检查类路径中类的字节码来实现的,可以选择限制为包或预索引

现在,如果我希望在类型的派生类中搜索字段,我该怎么办


一旦你找到了派生类,你就可以用同样的方法来检查它们。

你的问题真的是“我如何找到所有派生类?”听起来就是这样的-
字段
位让我分心。我意识到,就在你在这里发表评论的前一秒。我更正了标题。你的问题真的是“我如何找到所有派生类?”听起来是这样的,
字段
位让我分心。我意识到,就在你评论这里的前一秒。我更正了标题。你能想象一个问题,其中唯一的解决方案是这个(遍历派生类)?您在编写的应用程序中使用过此功能吗?我不明白您为什么要检查所有派生类的字段,所以我无法给您一个更具启发性的答案;)我建议您避免遍历Dervive类,因为加载此类类可能会产生副作用,例如,静态初始化程序块会运行。好吧,我也是这么想的。您能想象一个问题,其中唯一的解决方案就是这样(遍历派生类)吗?您在编写的应用程序中使用过此功能吗?我不明白您为什么要检查所有派生类的字段,所以我无法给您一个更具启发性的答案;)我建议您避免遍历Dervive类,因为加载此类类可能会产生副作用,例如静态初始化程序块运行。好吧,我也是这么想的。
    private Field extractField(Class<?> type, String fieldName) {
        Field ret = null;
        try {
            ret = type.getDeclaredField(fieldName);
        } catch (NoSuchFieldException e) {
            Class<?> superclass = type.getSuperclass();
            if (superclass == null) {
                throw new IllegalArgumentException("Missing field detected.", e);
            } else {
                ret = extractField(superclass, fieldName);
            }
        }
        return ret;
    }