当前位置: 首页 > 知识库问答 >
问题:

如何获取存储在字段中的对象,然后获取其类,然后获取该类的字段等?(递归获取类的字段)

裴威
2023-03-14

快速编辑:正如下面指出的,我应该做BFS,但我需要一个点来停止检索新字段,我还没有时间考虑。谢谢你的帮助!

我试图使用Java反射递归地获取类的字段,本质上创建一个树来显示

Class
 field1 class
  field1.1 class
  field1.2 class
 field2 class
  field 2.1 class
  field 2.2 class

这是一个递归解析器,所以我认为递归显示函数是很酷的。不幸的是,它压垮了我。

示例类Foo,具有Class1和Class2字段,每个字段可以有更多不同类的字段:

class Assignment extends Statement {
Variable target;
Expression source;
Assignment (Variable t, Expression e) {
    target = t;
    source = e;
}

我的递归方法:

private void recurse(Object object){
    System.out.println(object.getClass());
    for (Field field : object.getClass().getDeclaredFields()){
        System.out.println(field.getType());
        System.out.println(field.getName());
        if(!field.getType().isPrimitive() || field.getType() instanceof Class || field.getName() != "clazz"){
            //recurse(field);
        }
    }

println已经用于测试,Foo的一个示例输出(没有递归,它似乎可以工作)将

class Assignment
class Variable
target
class Expression
source

但是我不知道如何获取变量类,然后获取它的字段等等。包含此信息的字段为我提供了一个类字段。

此外,我意识到我需要一个点来停止递归,但是停止在原生字段似乎不起作用。任何建议都将是有用的,并真正帮助我理解我似乎在四处游荡的本质。

旁注:对于这个类的方法,我知道我可以为每个类放入一个display方法并调用它们,但是我认为反射过程似乎更有趣,并且可能是可重用的。

TLDR:如何获取字段中包含的实际字段的类?

对不起,如果我遗漏了什么,我问的第一个问题。

谢谢你的时间!

-亚历克斯

共有2个答案

贾俊喆
2023-03-14

因为您会立即重复出现,所以在进入下一个字段之前,您将一直深入到顶级类的第一个字段上的Object。换句话说,您正在进行深度优先搜索。

您正在寻找更像广度优先搜索的输出。这将涉及到使用队列,并在末尾添加新类,然后弹出下一个进程,而不是使用递归

你已经做到了这一步,所以我不会把整件事都告诉你,我相信这里有足够的东西来收拾剩下的。

盖嘉庆
2023-03-14

你在描述一个图,以及其中的搜索算法。

您的图形是G=(V,E)其中V={all object types}E={(u,V)| u有一个V}类型的字段

您可以使用BFS从单个源“浏览”图形,并从它[单个源]获取所有“可访问顶点[类型]”。

BFS持有一个已访问的集合,并避免探索已探索的顶点[类型],当没有新发现[队列为空]时,[BFS]停止。

DFS也可以做同样的事情,但同样-您需要一个访问集,以避免图形有循环时出现无限循环[例如:在一些复合类的实现中,例如树,其中每个节点都包含一个节点本身]。

 类似资料:
  • 问题内容: 我创建了一个简单的注释类: 我在像这样的一些类中使用它: 我知道我可以遍历声明的字段并获得如下注释: 如何在不迭代类的声明字段的情况下直接通过带注释的名称获取字段? 问题答案: 如果需要进行多次访问,则可以预处理注释。

  • 这里Book是根类,即最终的CSV将命名为books.CSV。 使用,我们只获得字段名title和author,但是我们还需要来自author类的字段名(name和age),有没有方法获得这些字段名?

  • 知道如何根据Jackson的ObjectMapper对象和特定的Class检索给定json路径的Java类型吗? 假设我们有 Jackson的ObjectMapper我想找到一种方法,将字符串值反序列化到给定路径上由字段表示的类型的对象(或至少获取其类型),例如。 给定“/accountOwner/age”和“25”得到25(整数类型) 给定“/accountOwner/active”和“true

  • 问题内容: 我有课: 然后创建对象: 尝试获取所有字段后,我打电话 但是我只有一个数组 如何从所有类的所有字段包括扩展? 问题答案: 请尝试以下操作:

  • 问题内容: 我正在编写我的第一个注释处理器,但遇到一些琐碎的问题,但找不到任何有关它的信息。 我有一个带有注释的元素 当我将此属性作为处理器中的元素获取时,我似乎无法以任何方式获取元素的类型。在这种情况下,可能要获取代表String的Class或TypeElement实例。 我尝试使用实例化容器类型的类对象,但它引发了ClassNotFoundException。我认为这是因为我无法访问包含该类的

  • 问题内容: 情况:我收集了文档,每个文档都包含以下字段:“ _ id”(ObjectId),“ userId”(String),但也可以是字段“ files”(Object)。 当我这样做时: 结果,我得到了所有记录,这很好。 但是,当我这样做时,仅在“文件”字段存在的地方获取记录-结果是错误的。 是否由于我试图获取“对象”字段而发生错误?以及如何使用查询或条件解决此问题? 问题答案: 您可以构造