2011-02-05 9 views
0

ノードがオブジェクトである動的なJTreeが必要です。ノードが展開されると、宣言されたフィールドを取得するためにリフレクションが使用されます。すべての非プリミティブなフィールドは、再びノードであり、以下同様に再帰的になります。だからここオブジェクトのJTreeとその宣言フィールドをリフレクションで作成する

は私のTreeNodeクラスの短いDESCです:

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. Objectの代わりにClassパラメータをコンストラクタに渡す必要がありますか?

  3. もし私がこれを行うと、後で私はこのクラスのオブジェクトを取得する必要があり、私はclass.getConstructorでそれを試してみてください - もう一度、私はパラメータを持っていません。

この呪われたループから抜け出す方法は?私はリフレクションで全く新しいです。同様の仕事の例は何ですか?

ありがとうございました

+0

これに反射を使用する背景には何がありますか?おそらく_architechture_は、代わりにあなたのために自然にこれらの問題を解決することができます。 –

+0

@JohanSjöberg:リフレクションを使用する理由は、jtreeにチェックボックスがあり、一部のノード/リーフのチェックボックスをクリックすると、フィールド名が動的クエリ生成で使用されるためです。申し訳ありませんが、あなたは "建築"を説明できますか?私はそれに精通していない。 Thanx – Julia

+0

私がここに暗示しようとしているのは、リフレクションを使用するのではなく、プログラムを設計する場合、通常のinstationロジックを使用して解決策を見つけることができるということです。 –

答えて

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(); 
    } 
} 

でもするだろうこのようにして作成されたすべてのオブジェクトのソースコードは、すべてがデフォルトコンストラクタを持つように強制することができます。

+0

引数のないコンストラクタがない場合、ポイント1は機能しません。他のコンストラクタを指定しない場合にのみ自動生成されます。ポイント3はコンストラクタが継承されないので動作しません。 –

+0

@PaŭloEbermann:他のアイデア? thanx – Julia

+0

タイプイントロスペクション用のツリーを作成したいだけなら、 'Class'オブジェクトで十分です。既存のオブジェクトを表示する場合は、すでにオブジェクトがあります(作成する必要はありません)。動的にオブジェクトを作成したい場合は、今はアイデアがありません。私はあなたがあなたのクラスツリーが必要なものを(質問を編集して)説明すべきだと思います。 –

関連する問題