11

クラスが注釈を定義した場合、そのサブクラスに同じ注釈を定義させることは何とか可能ですか?

たとえば、単純なクラス/サブクラスのペアがあり、それを共有しています。@Author @interface. 私がやりたいことは、さらにサブクラスごとに同じアノテーションを定義するように強制し、将来のどこかを@Author防ぐことです。RuntimeException

TestClass.java:

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@interface Author { String name(); }

@Author( name = "foo" )
public abstract class TestClass
{
    public static String getInfo( Class<? extends TestClass> c )
    {
        return c.getAnnotation( Author.class ).name();
    }

    public static void main( String[] args )
    {
        System.out.println( "The test class was written by "
                        + getInfo( TestClass.class ) );
        System.out.println( "The test subclass was written by " 
                        + getInfo( TestSubClass.class ) );
    }
}

TestSubClass.java:

@Author( name = "bar" )
public abstract class TestSubClass extends TestClass {}

実行時にすべての注釈を列挙し、不足している をチェックできることはわかっています@Authorが、可能であればコンパイル時にこれを実行したいと考えています。

4

3 に答える 3

4

コンパイル時にJSR 269でそれを行うことができます。参照: http://today.java.net/pub/a/today/2006/06/29/validate-java-ee-annotations-with-annotation-processors.html#pluggable-annotation-processing-api

編集 2020-09-20: リンクは無効です。アーカイブ バージョンはこちら: https://web.archive.org/web/20150516080739/http://today.java.net/pub/a/today/2006/06/29 /validate-java-ee-annotations-with-annotation-processors.html

于 2008-10-17T21:09:26.390 に答える
3

スーパークラスで@Explicitを使用してアノテーション(@EnforceAuthorなど)を作成し、コンパイラアノテーション(Java 1.6以降)を使用してコンパイル時に追いつくことができます。次に、サブクラスへの参照があり、別のアノテーション(@Authorなど)が欠落していないかどうかを確認できます。これにより、エラーメッセージでコンパイルをキャンセルできます。

于 2008-09-18T18:42:15.157 に答える
3

コンパイル時にこれを行うことは不可能であると確信しています。

ただし、これは「単体」テストの明らかなタスクです。強制したいが、コンパイラでチェックするのが難しい、または不可能なこのような規則がある場合、「ユニット」テストはそれらをチェックする簡単な方法です。

もう 1 つの可能性は、静的アナライザーにカスタム ルールを実装することです。ここにも多くのオプションがあります。

(これは実際には特定のユニットではなく、慣習のテストであるため、ユニットを恐怖の引用符で囲みます。ただし、ユニットテストと一緒に実行する必要があります)。

于 2008-09-18T18:38:53.433 に答える