美文网首页
java基础之注解

java基础之注解

作者: 墨线宝 | 来源:发表于2023-10-29 09:55 被阅读0次

    注解

    java中包含5种元注解

    • @Target 表示注解可用于哪些地方,包含TYPE(类)、METHOD(方法)、PARAMETER(参数)、CONSTRUCTOR(构造器)、FIELD(字段)、LOCAL_VARIABLE(局部变量)、ANNOTATION_TYPE、PACKAGE(包)、TYPE_PARAMETER、TYPE_USE

    • @Retention 表示注解信息保存的生命周期 SOURCE(注解被编译器丢弃)、CLASS(注解在class文件中可用,会被VM丢弃)、RUNTIME(VM在运行期也保留注解,可通过反射机制读取注解的信息)

    • @Documented 将此注解保存在Javadoc中

    • @Inherited 允许子类继承父类的注解

    • @Repeatable 允许一个注解可以被使用一次或多次

    注解处理器用来处理注解进行工作,对于RUNTIME的注解可以在运行期操作,可以使用反射,而SOURCE和CLASS就只能在注解处理器Processor来操作了

    注:注解处理器要和项目分开

    注解处理器项目需要添加maven插件 该项目编译时不加载注解处理器,不然会报错

    <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文件,在里面写上处理器的全路径

    com.zhanghe.MyProcessor
    
    @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;
    
        /**
         * 该方法再编译期间会被注入一个ProcessingEnvironment对象,该对象包含了很多有用的工具类。
         *
         * @param processingEnv
         */
        @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);
        }
    
        /**
        * 相当于main方法
        */
        @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;
        }
    }
    

    准备使用注解处理器修改源文件,之后再研究

    https://zhhll.icu/2020/java基础/注解/1.java基础之注解/

    本文由mdnice多平台发布

    相关文章

      网友评论

          本文标题:java基础之注解

          本文链接:https://www.haomeiwen.com/subject/eifvidtx.html