2015-10-19 35 views
0

我有一個具有包含其他類的結構的類,每個類也可以包含不同的類。所以這是類的樹結構。如何獲得在類中確定的對象的實例

public class FirstLevelClass { 
    public SecondLevelClass1 secondLevelClass1; 
    public SecondLevelClass2 secondLevelClass2; 
    ... 
} 

public class SecondLevelClass1 { 
    public ThirdLevelClass thirdLevelClass; 
    public String fieldSecondLevelClass; 
    ... 
} 

我初始化了FirstLevelClass的變量。

FirstLevelClass firstLevelClass; 

我需要獲取存儲在firstLevelClass中的secondLevelClass1的實例。我該怎麼做,有SecondLevelClass1類的名字?

基本上我需要得到SecondLevelClass1中字段的值。因爲,我稱之爲fieldSecondLevelClass.get(...)與心不是實例初始化

String fieldName = "fieldSecondLevelClass"; 
Field[] fields = firstLevelClass.getClass().getDeclaredFields(); 
Object foundValue = null; 

for (Field field : fields) { 
    Field foundField = null; 
    foundField = field.getType().getDeclaredField(fieldName); 
    foundValue = fieldSecondLevelClass.get((Class.forName(foundField.getDeclaringClass().getName())).newInstance()); 
} 

:可是寫這個的時候我失敗了。但如果我寫

foundValue = foundField.get(((FirstLevelClass) firstLevelClass).secondLevelClass1); 

它會正常工作。 因此,你做任何想法如何使用它的名稱和FirstLevelClass的實例將secondLevelClass1的實例傳遞給fieldSecondLevelClass.get(...)?

+4

叫我瘋了,但...你爲什麼要通過反思來做到這一點,而不是爲你感興趣的領域提供一個吸氣劑? – JonK

+0

如果該字段沒有被初始化,那麼*就是*沒有「正確的實例」。 –

+0

2JonK是我可以,但這對我來說是一個挑戰,要解決這個問題 – Alex

回答

0

你所有的領域都是公開的,所以你可以使用'。' firstLevelClass.secondLevelClass1在這種情況下就足夠了。

另一件事是,我沒有看到的

變量聲明fieldSceondLevelClass

0

這是很難理解你正在嘗試做的,但我會嘗試簡化本作您。

首先,你的領域是公開的。即使他們不是,你也可以暴露getters/accessors,所以沒有理由反思。

這對我來說也是一個紅旗,你有第一級的課,第二級的另一課,第三級的第三課。我想這取決於這些類型在它們的界面中有多少變化。如果這棵樹需要超過3層,我建議將它們抽象成一個通用的Node類,它引用了它的子元素,並且可以以任意順序嵌套它們。

public class Node { 
    private List<Node> children = new ArrayList<>(); 

    public void addChild(Node c) { 
     children.add(c); 
    } 

    public Node[] getChildren() { 
     return children.toArray(new Node[0]); 
    } 
} 

public class SomethingElse { 
    public static void main(String[] args) { 
     Node firstLevel = new Node(); 
     Node secondLevel = new Node(); 
     secondLevel.addChild(new Node()); 
     firstLevel.addChild(secondLevel); 
    } 
} 

這將更容易處理。但是,設計成本是它強制所有樹深度的所有節點具有相同的行爲。如果這不是你想要的,那麼這對你來說可能不太合適。

+0

謝謝你的回答!我有這樣複雜的類樹的原因是我對我需要處理的數據的限制。數據結構是通過json定義的,也是通過樹來表示的。爲了填充java中的對象,我使用了gson庫。如果對象的結構與json表示的結構相同,它使得過程變得簡單。所以我受到這個要求的限制。而且每個級別的課程都是獨一無二的,所以不幸的是你不得不使用gson轉換結構。不管怎麼說,還是要謝謝你! – Alex

相關問題