6

ジェネレータを使用してクラスを作成しているときに、タイプのすべてのサブクラスを検出することができます。この手法は、たとえばGWT Showcaseソース(完全なコードを参照)にあります。

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

私は似たようなことをしたいのですが、クラスを拡張する(またはインターフェースを実装する)代わりに

public class SomeWidget extends ContentWidget { ... }

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

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

そして、@ MyAnnotationで注釈が付けられているすべてのウィジェットを見つけますか?のような方法は見つかりませんでしたが、JAnnotationType.getAnnotatedTypes()盲目なのかもしれません。

注:を使用して、 Google Reflectionsライブラリで動作させることができましたがreflections.getTypesAnnotatedWith(SomeAnnotation.class)、代わりにGeneratorContextを使用することをお勧めします。これは、DevModeでアプリをリロードするときに非常にうまく機能するためです。

4

1 に答える 1

8

はい-最も簡単な方法は、すべてのタイプを反復処理し、それらに注釈があるかどうかを確認することです。他のルールもあるかもしれません(公開されている、抽象的ではない)、そのときにも実行する必要があります。

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

インスタンスは、を使用してTypeOracle取得できます。GeneratorContextcontext.getTypeOracle()

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

于 2012-05-09T18:43:45.917 に答える