Javaのアノテーションを防止することは、最終的なフィールドに追加します

イシュトDevai:
@MyAnnotation
final Integer value;

それは非finalフィールドに追加するとき上記のコンパイル時にエラーが発生します方法で、カスタム注釈MyAnnotation、ないコンパイル時のエラーを設定することは可能ですか?(アクセスレベルに関係なく)。

背景情報:私たちのコードでは、我々はトリガが外部のクラスからの反射を経て変更と私たちはコンパイル時に注釈をユーザーに警告したいと思いますので、これは、最後のフィールドに対して行うことができないという特別な注釈を持っている(現在、我々は、ランタイムを持っています例外をスローしますチェック)。

なスロー:

1つのオプションはある注釈プロセッサたとえば、次のような注釈を持っている場合:

package com.example;

import java.lang.annotation.ElementType;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME) // must be at least SOURCE
@Target(ElementType.FIELD)
public @interface Foo {}

場合は、以下のエラーが出力されます@Foo上に存在するfinalフィールド:

package com.example;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.Element;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic.Kind;
import java.util.Set;

@SupportedAnnotationTypes("com.example.Foo")
@SupportedSourceVersion(SourceVersion.RELEASE_13) // or whatever version you support
public class FooProcessor extends AbstractProcessor {

  @Override
  public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
    if (!annotations.isEmpty()) {
      // This processor is only declared to process one annotation
      TypeElement foo = annotations.iterator().next();

      for (Element element : roundEnv.getElementsAnnotatedWith(foo)) {
        for (AnnotationMirror mirror : element.getAnnotationMirrors()) {
          if (mirror.getAnnotationType().asElement().equals(foo)
              && element.getModifiers().contains(Modifier.FINAL)) {
            // processingEnv is a protected field of AbstractProcessor
            processingEnv.getMessager()
                .printMessage(Kind.ERROR, "Field cannot be final.", element, mirror);
            break;
          }
        }
      }
    }
    return true;
  }
}

上記のコードでは、私は唯一のモデルのAPI(例えば使用TypeElement参照するために)Foo注釈を。ただし、注釈プロセッサのAPIが1注釈(例えばのクラスを使用することができないというFoo.class注釈が表示されている場合)(つまり、あなたのプロセッサは、アノテーションへの依存性を持っています)。クラスのAPIを使用することについての理由により簡単に、より使いやすくすることができ、かつ読みやすく、使用するように、アノテーションクラスがあなたのプロセッサのクラスに表示されている場合、それを。


その後、指示する必要がありますjavac注釈プロセッサを使用します。参照ツール仕様の詳細については、を。具体的には、見て--processor-path--processor-module-path-processor、と-procだけでなく、標準オプションセクション注釈処理に。

あなたの注釈プロセッサの使用を強制することができない場合があります。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=330902&siteId=1