千问 EclipseIDE AnnotationMirror JAVA DEMO
Here’s a practical Eclipse IDE Java Annotation Processing demo using AnnotationMirror:
Project Structure:
AnnotationMirrorDemo/ ├── src/ │ ├── annotations/ │ │ └── DataClass.java │ ├── processors/ │ │ └── DataProcessor.java │ └── demo/ │ └── User.java ├── resources/ │ └── META-INF/ │ └── services/ │ └── javax.annotation.processing.Processor └── pom.xml (for Maven) or .classpath Step 1: Create the Annotation
// File: src/annotations/DataClass.javapackageannotations;importjava.lang.annotation.*;@Retention(RetentionPolicy.SOURCE)// Only needed at compile time@Target(ElementType.TYPE)// Can only be applied to classespublic@interfaceDataClass{ StringtableName()default"";booleanpersistent()defaulttrue;String[]tags()default{ };Class<?>repository()defaultVoid.class;}Step 2: Create the Annotation Processor
// File: src/processors/DataProcessor.javapackageprocessors;importannotations.DataClass;importjavax.annotation.processing.*;importjavax.lang.model.SourceVersion;importjavax.lang.model.element.*;importjavax.lang.model.type.DeclaredType;importjavax.lang.model.util.*;importjavax.tools.Diagnostic;importjavax.tools.JavaFileObject;importjava.io.Writer;importjava.util.*;importjava.util.stream.Collectors;@SupportedAnnotationTypes("annotations.DataClass")@SupportedSourceVersion(SourceVersion.RELEASE_11)publicclassDataProcessorextendsAbstractProcessor{ privateProcessingEnvironment processingEnv;privateElements elementUtils;privateTypes typeUtils;privateFiler filer;privateMessager messager;@Overridepublicsynchronizedvoidinit(ProcessingEnvironment processingEnv){ super.init(processingEnv);this.processingEnv = processingEnv;this.elementUtils = processingEnv.getElementUtils();this.typeUtils = processingEnv.getTypeUtils();this.filer = processingEnv.getFiler();this.messager = processingEnv.getMessager(); messager.printMessage(Diagnostic.Kind.NOTE,"DataProcessor initialized for @DataClass");}@Overridepublicbooleanprocess(Set<?extendsTypeElement> annotations,RoundEnvironment roundEnv){ for(TypeElement annotation : annotations){ Set<?extendsElement> annotatedElements = roundEnv.getElementsAnnotatedWith(annotation);for(Element element : annotatedElements){ if(element.getKind()==ElementKind.CLASS){ processDataClass((TypeElement) element);}}}returntrue;// Claim the annotation}privatevoidprocessDataClass(TypeElement classElement){ try