Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取存储在字段中的对象,然后获取其类,然后获取该类的字段等?(递归获取类的字段)_Java_Reflection_Recursion - Fatal编程技术网

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

Java 如何获取存储在字段中的对象,然后获取其类,然后获取该类的字段等?(递归获取类的字段),java,reflection,recursion,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

快速编辑:正如下面指出的,我应该做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的一个示例输出(没有递归,它似乎可以工作)将

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

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

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

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

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

谢谢你的时间


-Alex

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

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


你已经做到了这一步,所以我不打算为你解释全部内容,我相信这里有足够的内容来解释其余部分。

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

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

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

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


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

谢谢!我一开始试过,但完全忘记了和田地打斗时分心!再次感谢您的帮助:)@user1314060:非常欢迎您。完成后,不要忘记回答其中一个问题[你认为对你最有用的问题!]。祝你好运!哦,还有一件事:你可能也对阅读感兴趣,这是不同的,但显示出相似的想法:)@corsiKa:(1)OP查找一个类的所有字段,然后递归地查找它们的字段。正如我在
G
符号中所描述的,它非常像一个图,它可以有循环。[
类树{Tree t}
](2)java在
接口方面有多重继承。的确,您只能扩展一个类,但您可以
实现
多个
接口
s。@amit(1)OP正在查找所有类的所有字段。如果他点击了一个接口,它将没有字段可以放入队列中。这意味着只有具体的类才会真正进入他的队列。所有这些都将在一个点上结束,
java.lang.Object
。在该根节点处拾取树,并让其余的树悬挂下来-由于访问标志,将不会有循环。(2) 接口不是多重继承。事实上,接口是专门添加到Java中的,以解决Java没有多重继承的问题。@corsiKa:为什么它们最终都是
对象
?他不是在寻找每个字段的
super
,他只是在寻找所有字段。例如:
类树{Tree left,right;}
,在不维护
访问集的情况下,
的“顶点”将不断扩展,而不终止此分支,因为有一条边
(树,树)
,因为
的一个字段。也许我们中的一个人没有正确理解这个问题。[不否认是我,我不是以英语为母语的人]谢谢!我最初做这件事时分心了,似乎是在我编程时发生的,幸运的是我保留了我的队列代码,并且可以保留我学到的关于字段的代码。再次感谢您的帮助!:)
class Assignment
class Variable
target
class Expression
source