Java 如何获取存储在字段中的对象,然后获取其类,然后获取该类的字段等?(递归获取类的字段)
快速编辑:正如下面指出的,我应该做BFS,但我需要一个点来停止检索新字段,我还没有时间考虑。谢谢你的帮助 我试图使用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
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