2012-05-09 8 views
6

Generatorsを使用してクラスを作成する際に、あるタイプのすべてのサブクラスを検出することができます。GWT GeneratorContextを使用して@MyAnnotationで注釈付けされたすべてのクラスを見つけることは可能ですか?

public class SomeWidget extends ContentWidget { ... } 

JClassType cwType = null; 
try { 
    cwType = context.getTypeOracle().getType(ContentWidget.class.getName()); 
} catch (NotFoundException e) { 
    logger.log(TreeLogger.ERROR, "Cannot find ContentWidget class", e); 
    throw new UnableToCompleteException(); 
} 
JClassType[] types = cwType.getSubtypes(); 

が、私は似た何かをしたいのですが、代わりのは(インターフェースをまたは実装)クラスを拡張する:あなたはGWTのショーケースのソースで例えば、この手法を見つけることができます(full codeを参照してください)

、私もでこれを行うことができますか?ウィジェットに注釈を付けますか?

@MyAnnotation(...) 
public class SomeWidget extends Widget { ... } 

そして、@MyAnnotationで注釈付けされたすべてのウィジェットを検索しますか? JAnnotationType.getAnnotatedTypes()のようなメソッドを見つけることができませんでしたが、おそらく私は盲目ですか?

注:私はそれがreflections.getTypesAnnotatedWith(SomeAnnotation.class)を使用して、Google Reflectionsライブラリーで動作させることができましたが、私はDevModeからでアプリをリロードするとき、これはかなり良く働く特にので、代わりにGeneratorContextを使用して好みます。

答えて

8

はい - 最も簡単な方法は、すべてのタイプを繰り返してアノテーションを確認することです。その時に行うべき他のルールも(公開されている、非抽象的な)ルールを持つかもしれません。

for (JClassType type : oracle.getTypes()) { 
    MyAnnotation annotation = type.getAnnotation(MyAnnotation.class); 
    if (annotation != null && ...) { 
    // handle this type 
    } 
} 

TypeOracleインスタンスはcontext.getTypeOracle()を用いGeneratorContextから得ることができます。

これは、ソースパス上のタイプにのみアクセスできることに注意してください。すなわち、現在継承されているモジュールに基づいて現在利用可能なタイプのみが使用され、<source>タグが使用中です。

+0

+1、これは間違いなく機能し、このアプローチは考慮しませんでした。これは一種の凶暴な方法です(誰も何百万ものタイプを持つことはないのであまり重要ではありません)。あらかじめ定義された解決策がない場合、私はあなたの答えを喜んで受け入れます。 –

+0

それはほとんどのJavaの観点からは強引な力を感じますが、ソースパスの中でそれほど悪くはありません。さらに、Google Reflectionsライブラリの機能も同様です。現在、クラスパスにあるすべてのクラスを見つけて調べます。 –

関連する問題