次のカスタム Java アノテーションの場合
@CustomAnnotation(clazz=SomeClass.class)
public class MyApplicationCode
{
...
}
私は基本的に、コンパイル時に MyApplicationCode の Class オブジェクトと clazz パラメータの両方を取得して、コーディング規約の一貫性を確認できるようにしたいと考えています (別の話です)。基本的に、注釈プロセッサで MyApplicationCode.class および Someclass.class コードにアクセスできるようにしたいと考えています。私はほとんどそこにいますが、何かが欠けています。私は持っている
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface CustomAnnotation
{
public Class clazz();
}
それから私はプロセッサのために持っています:
public class CustomAnnotationProcessor extends AbstractProcessor
{
private ProcessingEnvironment processingEnvironment;
@Override
public synchronized void init(ProcessingEnvironment processingEnvironment)
{
this.processingEnvironment = processingEnvironment;
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment environment)
{
Set<? extends Element> elements = environment.getElementsAnnotatedWith(ActionCommand.class);
for(Element e : elements)
{
Annotation annotation = e.getAnnotation(CustomAnnotation.class);
Class clazz = ((CustomAnnotation)annotation).clazz();
// How do I get the actual CustomAnnotation clazz?
// When I try to do clazz.getName() I get the following ERROR:
// Attempt to access Class object for TypeMirror SomeClass
// Also, how do I get the Class object for the class that has the annotation within it?
// In other words, how do I get MyApplicationCode.class?
}
}
}
したがって、process メソッドで実行しようとしているのは、以下の元のコードから SomeClass.class と MyApplication.class を取得して、コンパイル時にカスタム検証を行うことです。私は一生、これらの2つの値を取得する方法を理解できないようです...
@CustomAnnotation(clazz=SomeClass.class)
public class MyApplicationCode
更新:次の投稿には、さらに多くの詳細があり、さらに詳しくなっています。しかし、問題は、クラス オブジェクトをプルする TypeMirror オブジェクトが得られることです。これについては説明していません。 -from-annotations-in-an-annotationprocessor/
Update2: 次のようにして MyApplication.class を取得できます
String classname = ((TypeElement)e).getQualifiedName().toString();