注解
java中包含5种元注解
@Target 表示注解可用于哪些地方,包含TYPE(类)、METHOD(方法)、PARAMETER(参数)、CONSTRUCTOR(构造器)、FIELD(字段)、LOCAL_VARIABLE(局部变量)、ANNOTATION_TYPE、PACKAGE(包)、TYPE_PARAMETER、TYPE_USE
@Retention 表示注解信息保存的生命周期 SOURCE(注解被编译器丢弃)、CLASS(注解在class文件中可用,会被JVM丢弃)、RUNTIME(JVM在运行期也保留注解,可通过反射机制读取注解的信息)
@Documented 将此注解保存在Javadoc中
@Inherited 允许子类继承父类的注解
@Repeatable 允许一个注解可以被使用一次或多次
注解处理器用来处理注解进行工作,对于RUNTIME的注解可以在运行期操作,可以使用反射,而SOURCE和CLASS就只能在注解处理器Processor来操作了
注:注解处理器要和项目分开
注解处理器项目需要添加maven插件 该项目编译时不加载注解处理器,不然会报错
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <compilerArgument> -proc:none </compilerArgument> <source>1.8</source> <target>1.8</target> </configuration> </plugin><plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <compilerArgument> -proc:none </compilerArgument> <source>1.8</source> <target>1.8</target> </configuration> </plugin>
|
注解处理器注册
需要在resources下创建META-INF目录,创建services目录,创建javax.annotation.processing.Processor文件,在里面写上处理器的全路径
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| @SupportedAnnotationTypes({"com.zhanghe.Test"}) @SupportedSourceVersion(SourceVersion.RELEASE_8) public class MyProcessor extends AbstractProcessor {
private Filer filer;
private Locale locale;
private Elements elements;
private Types types;
private StandardJavaFileManager standardJavaFileManager;
@Override public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv); filer = processingEnv.getFiler(); locale = processingEnv.getLocale(); elements = processingEnv.getElementUtils(); types = processingEnv.getTypeUtils(); JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler(); DiagnosticCollector<JavaFileObject> collector = new DiagnosticCollector<>(); standardJavaFileManager = javaCompiler.getStandardFileManager(collector, null, null); }
@Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { for (TypeElement annotation : annotations) { System.out.println(annotation);
} for (Element element : roundEnv.getElementsAnnotatedWith(Test.class)) { if (element.getKind() == ElementKind.CLASS) { TypeElement typeElement = (TypeElement) element; PackageElement packageElement = elements.getPackageOf(element); String packagePath = packageElement.getQualifiedName().toString(); String className = typeElement.getSimpleName().toString(); System.out.println("packagePath:" + packagePath); System.out.println("className:" + className); } System.out.println(element.getKind() + " : " + element.getModifiers() + " : " + element.getSimpleName() + " : " + element.asType()); } return false; } }
|
准备使用注解处理器修改源文件,之后再研究