@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
だけでなく、標準オプションセクション注釈処理に。
あなたの注釈プロセッサの使用を強制することができない場合があります。