美文网首页
Java注解

Java注解

作者: 莫问前程F6 | 来源:发表于2021-08-23 11:09 被阅读0次

    注解分类

    • Java自带的标准注解
      @Override 标明重写某个方法
      @Deprecated 标明某个类或方法过时
      @SuppressWarnings 标明要忽略的警告
    • 元注解(注解的注解)
      @Retention(标明注解被保留的阶段)
      @Target(标明注解使用的范围)
      @Inherited(标明注解可继承)
      @Documented(标明是否生成javadoc文档)
    • 自定义注解

    注解的用途

    • 生成文档,通过代码里标识的元数据生成javadoc文档。
    • 编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。
    • 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。
    • 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例

    注解使用演示

    • 定义一个可以注解在Class,interface,enum上的注解,

    • 定义一个可以注解在METHOD上的注解

    • 定义一个可以注解在FIELD上的注解

    • 定义一个可以注解在PARAMETER上的注解

    /*
     * 定义一个可以注解在Class,interface,enum上的注解
     */
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyAnTargetType {
        /**
         * 定义注解的一个元素 并给定默认值
         * @return
         */
        String value() default "我是定义在类接口枚举类上的注解元素value的默认值";
    }
    
    /**
     * 定义一个可以注解在METHOD上的注解
     */
    @Target({ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyAnTargetMethod {
        /**
         * 定义注解的一个元素 并给定默认值
         * @return
         */
        String value() default "我是定义在方法上的注解元素value的默认值";
    }
    
    /**
     * 定义一个可以注解在FIELD上的注解
     */
    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyAnTargetField {
        /**
         * 定义注解的一个元素 并给定默认值
         * @return
         */
        String value() default "我是定义在字段上的注解元素value的默认值";
    }
    
    /**
     * 定义一个可以注解在PARAMETER上的注解
     */
    @Target({ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyAnTargetParameter {
        /**
         * 定义注解的一个元素 并给定默认值
         * @return
         */
        String value() default "我是定义在参数上的注解元素value的默认值";
    }
    
    /**
     * 测试java注解类
     */
    @MyAnTargetType
    public class AnnotationTest {
        @MyAnTargetField
        private String field = "我是字段";
        @MyAnTargetMethod("测试方法")
        public void test(@MyAnTargetParameter String args) {
            System.out.println("参数值 === "+args);
        }
        public static void main(String[] args) {
            // 获取类上的注解MyAnTargetType
            MyAnTargetType t = AnnotationTest.class.getAnnotation(MyAnTargetType.class);
            System.out.println("类上的注解值 === "+t.value());
            MyAnTargetMethod tm = null;
            try {
                // 根据反射获取AnnotationTest类上的test方法
                Method method = AnnotationTest.class.getDeclaredMethod("test",String.class);
                // 获取方法上的注解MyAnTargetMethod
                tm = method.getAnnotation(MyAnTargetMethod.class);
                System.out.println("方法上的注解值 === "+tm.value());
                // 获取方法上的所有参数注解  循环所有注解找到MyAnTargetParameter注解
                Annotation[][] annotations = method.getParameterAnnotations();
                for(Annotation[] tt : annotations){
                    for(Annotation t1:tt){
                        if(t1 instanceof MyAnTargetParameter){
                            System.out.println("参数上的注解值 === "+((MyAnTargetParameter) t1).value());
                        }
                    }
                }
                method.invoke(new AnnotationTest(), "改变默认参数");
                // 获取AnnotationTest类上字段field的注解MyAnTargetField
                MyAnTargetField fieldAn = AnnotationTest.class.getDeclaredField("field").getAnnotation(MyAnTargetField.class);
                System.out.println("字段上的注解值 === "+fieldAn.value());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Java注解

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