2

快速编辑:正如下面所指出的,我应该做一个 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

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

另外,我意识到我需要一个点来停止递归,但在原始字段停止似乎不起作用。任何建议都会很有用,并且真的可以帮助我理解我似乎在四处游荡的本质。

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

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

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

谢谢你的时间!

-亚历克斯

4

2 回答 2

1

好吧,您正在描述一个图形,以及其中的一个搜索算法。

你的图表是G=(V,E)哪里V = {all object types }E = { (u,v) | u has a field of type v }

您可以使用BFS从单一来源“探索”您的图形,并从中获取所有“可访问的顶点 [类型]”[单一来源]。

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

同样的事情可以用DFS完成,但同样 - 你将需要一个visited集合,以避免当图形有循环时出现无限循环[例如:在复合类的某些实现中,例如一棵树,其中每个Node包含一个Node本身]。

于 2012-04-13T18:12:54.443 回答
0

因为您会立即重复,所以您将一直到顶级类的第一个字段上的 Object ,然后再继续下一个。换句话说,您正在执行深度优先搜索。

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

你已经做到了这一点,所以我不会为你拼出整个事情,我相信这里有足够的东西来挑选其余的。

于 2012-04-13T18:10:23.543 回答