[英]How do I get the object stored in a field, to then get its class, then get the fields of that class etc? (Recursively obtain fields of classes)
快速編輯:正如下面所指出的,我應該做一個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:如何獲取字段中包含的實際字段的類?
抱歉,如果我缺少任何東西,我問的第一個問題。
謝謝你的時間!
-Alex
好吧,您正在描述一個圖形及其中的搜索算法。
您的圖形為G=(V,E)
,其中V = {all object types }
, E = { (u,v) | u has a field of type v }
E = { (u,v) | u has a field of type v }
。
您可以使用BFS從單一來源“探索”圖形,並從中[單一來源]獲取所有“可訪問的頂點[類型]”。
BFS擁有一個visited
集,並且避免探索已經探索過的頂點[類型],並且當沒有新內容可發現[隊列為空]時,它停止[BFS]。
同樣的事情可以做DFS ,但同樣-你將需要visited
設置,以避免無限循環,當有圖有周期 [例如:在一些實現復合類 ,比如一棵樹,其中每個Node
本身包含一個Node
]。
因為您馬上要復現,所以在繼續進行下一個之前,您將一路下降到頂層類第一個字段上的Object。 換句話說,您正在進行深度優先搜索。
您正在尋找的輸出更像是“廣度優先搜索”。 這將涉及使用隊列並在末尾添加新類,然后彈出下一個要處理的類,而不是使用遞歸。
您已經設法做到了這一點,所以我不會為您拼出全部內容,我敢肯定這里有足夠的余地來處理剩下的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.