2011-02-05 129 views
0

創建對象及其聲明的字段的JTree的,我需要動態的JTree其中節點將對象和在節點展開,我會用反射來獲得聲明的字段。所有非原始字段將再次成爲節點,依此類推,遞歸。與反思

因此,這裏是我的樹節點類的簡短說明:

public TreeNode(Object o){ 

     this.name = o.getClass().getSimpleName(); 
     this.treeobjectclass = o.getClass(); 
     this.isbranch = isBranchObject(); 
     this.properties = initializePropertiesMap(); 
     this.children = //here i will get children with getDeclared fields and 
         //instantiate new TreeNode for nonprimitive ones 

} 

問題:

  1. 當通過孩子做遞歸實例化,如何避免一個問題,當我碰到一個孩子構造函數要求參數的類?

  2. 如果我也許路過類參數,而不是對象爲構造?

  3. 如果我這樣做,如果以後我需要得到這個類的對象,我嘗試用class.getConstructor - 再次,我沒有參數。

如何擺脫這種詛咒的循環?我是全新的反思。任何類似工作的例子?

謝謝

+0

背後有什麼使用反射這樣做的動機是什麼?也許_architechture_可以自然地爲你解決這些問題。 – 2011-02-05 20:28:32

+0

@JohanSjöberg:使用反射的原因是jtree會有複選框,當單擊某個節點/葉子上的複選框時,字段名稱將用於動態查詢生成。我很抱歉你能解釋「建築」嗎?我不熟悉它。 Thanx – Julia 2011-02-05 20:32:38

回答

1

我會說這看起來並不像一個典型的使用情況進行反思。無論如何,嘗試回答您的問題:

  1. 你可以做的是,無論它是私有的還是不說您啓用默認的構造函數,使用ctor.setAccessible(true),並使用如實例化,clazz.newInstance()。然而,如果它不是那麼容易的話,那麼你就進入了構造函數參數的猜測遊戲,或者進入sun.misc.Unsafe.allocateInstance(clazz),這兩者都不是首選。

  2. 你使用它的是什麼,它看起來像它應該與類參考就夠了。傳遞一個對象意味着它被使用了,它並不是真的。

  3. 如果您只需要傳遞一個對象來獲取它的構造函數參數,那麼我會說您最好爲該對象傳遞一個factory以避免完全反射。這也是來自Oracle Secure Coding Guideline的建議。

的修改傳遞一個工廠是讓每一個需要實例提供了自己的工廠邏輯,如類,

interface FactoryProvider<T> { 
    public T getInstance(); 
} 

class Concrete implements FactoryProvider<Concrete> { 

    @Override 
    public Concrete getInstance() { 
     return new Concrete(); 
    } 
} 

但話又說回來,如果你有完全控制以這種方式創建的所有對象的源代碼,你可以自己強制它們都有默認的構造函數。