簡體   English   中英

如何獲取存儲在字段中的對象,然后獲取其類,然后獲取該類的字段,等等? (遞歸獲取類的字段)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM