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

时间:2012-04-13 18:04:15

标签: java reflection recursion

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

但我无法弄清楚如何获取Variable类然后获取其字段等等。包含此信息的字段为我提供了一个类Field。

另外,我意识到我需要一个点来停止递归,但停止在主要字段似乎不起作用。任何建议都是有用的,真正帮助我理解我似乎正在喋喋不休的细节。

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

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

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

谢谢你的时间!

-Alex

2 个答案:

答案 0 :(得分:1)

嗯,您正在描述图表及其中的搜索算法。

您的图表为G=(V,E),其中V = {all object types }E = { (u,v) | u has a field of type v }

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

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

使用DFS也可以做同样的事情,但是再次 - 你需要一个visited集,以避免在图表cycles时出现无限循环[例如] :在composite classes的某些实现中,例如树,其中每个Node都包含Node本身。

答案 1 :(得分:0)

因为你马上就会重复出现,所以你要在最高级别的第一个字段上一直到对象,然后继续下一个。换句话说,你正在进行深度优先搜索。

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

你已经设法做到这一点,所以我不打算为你拼出所有的东西,我相信这里有足够的东西来挑选其余部分。