6

私はインターネット上のいくつかの Annotation Processing Tool (APT) ガイド ( 12など) をフォローしており、コンパイラー/ビルド時にそれを機能させることができ、Eclipse でも機能させることができました。

実行時に APT を使用して、アノテーションを使用してタイプ (クラス) のリストを取得する方法はありますか?

私は次のようなものを書きました:

@SupportedAnnotationTypes("com.domain.MyAnnotation")
public class MyAbstractProcessor extends AbstractProcessor {

    public static Map<Element, MyAnnotation> patches = new HashMap<Element, MyAnnotation>();

    @Override
    public boolean process(final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnvironment) {

        // Get all classes that has the annotation
        Set<? extends Element> classElements = roundEnvironment.getElementsAnnotatedWith(MyAnnotation.class);

        // For each class that has the annotation
        for (final Element classElement : classElements) {

            patches.put(classElement, annotation);

したがって、 MyAbstractProcessor.patches には、注釈を使用してクラスのリストが入力されます。この APT が実行時ではなくビルド時に実行されるという欠点を除けば、素晴らしいアイデアです。

実行時に APT を使用することは可能ですか?

それとも、私が望むものを得るために間違ったフレームワークを使用していますか?

4

2 に答える 2

5

リフレクション - getAnnotationsを使用して、実行時に注釈にアクセスできます。

注釈を使用して (クラスパス内の) クラスのリストを取得するには、実行時に、その注釈があるかどうかをテストするすべてのクラスを反復処理できます。

または、ビルド時に、クラスのリストを使用してクラスを構築できます。

于 2012-04-20T06:51:17.423 に答える
1

RetentionPolicyを使用して、実行時にアノテーションを使用できるように指定しましたか? そうでない場合は、 @Retention アノテーションを使用する必要があります。

@Retention(RetentionPolicy.RUNTIME)

public @interface MyAnnotation {
    String[] parameters();
    String[] exceptions();
}
于 2012-04-20T07:00:51.023 に答える