2009-04-14 18 views
3

がインターフェイスまたはインターフェイスを指定したオブジェクト、クラスの実装を生成するための最良の方法は何ですか?自動生成値が

interface Vehicle 
{ 
    Engine getEngine(); 
} 

@Generated 
class Car implements Vehicle 
{ 
    private final Engine engine; 

    public Car(Engine engine) 
    { 
     this.engine = engine; 
    } 

    public Engine getEngine() 
    { 
     return engine; 
    } 

    // generated implementation of equals, hashCode, toString, 
} 

クラス変数は、インターフェイスのゲッタメソッドから派生する必要があります。理想的には、インタフェース内の共変の戻り値の型が処理されます。実装では、プライベートな最終変数とコンストラクタのインスタンス化を使用して不変性を優先する必要があります。 equalsメソッド、hashCodeメソッド、toStringメソッドを生成する必要があります。インタフェースのためのクラスを実装するとき

答えて

3

クリーンな方法は、実行時にクラスを動的に生成するためにCGLIBを使用しています。もちろん、ソースファイルを参照することはできません。

ソースファイルが必要な場合は、codemodelを試してみて、何か行うことができます:

JCodeModel cm = new JCodeModel(); 
x = cm._class("foo.bar.Car"); 
x.field(Engine.class, "engine"); 
for (PropertyDescriptor pd: Introspector. 
       getBeanInfo(Vehicle.class).getPropertyDescriptors()) { 
    g = x.method(JMod.PUBLIC, cm.VOID, pd.getReaderMethod().getName()); 
    g.body()... 
    s = x.method(JMod.PUBLIC, cm.VOID, "set" + pd.getName()); 
    s.body()... 
} 
hc = x.method(JMod.PUBLIC, cm.VOID, "hashCode")); 
hc.body()... 
cm.build(new File("target/generated-sources")); 

または以前に示唆したように、Eclipseで(IDEを使用します(ハッシュコードを生成」、メニュー「ソース」)をし、等しい()... "、すなわち)私はJCodeModelを

+0

しようとします。ありがとう! – parkr

1

はちょうど日食のように行うのですか。

方法は、ゲッターとしてのことを考えると、変数名とその型を抽出する方法を解析取得で始まる場合。これらのフィールドのコンストラクタも作成し、equals、hashcode、およびtoStringメソッドも実装します。

あなたは、通常のファイルの解析を行うことができますまたは多分反射もわからないことができます。

0

あなたも、あなたはそれを非常に多くをやってしようとしている場合は、あなたが構築された注釈プロセッサの機能を検討したいと思うかもしれdynamic Proxy

1

を使用して確認することができますコーディング定型であなたを助け、現代のJava IDEを使用した以外にもjavacに(Java SE 1.5で復活しました)。