• java中的注解


    Annotation(注释) 概述

      •从 JDK 5.0 开始, Java 增加了对元数据(MetaData) 的支持, 也就是 Annotation(注释)
      •Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理. 通过使用 Annotation, 程序员可以在不改变原有逻辑的情况下, 在源文件中嵌入一些补充信息.
      •Annotation 可以像修饰符一样被使用, 可用于修饰包,类, 构造器, 方法, 成员变量, 参数, 局部变量的声明, 这些信息被保存在 Annotation 的 “name=value” 对中.
      •Annotation 能被用来为程序元素(类, 方法, 成员变量等) 设置元数据
     
      使用 Annotation 时要在其前面增加 @ 符号, 并把该 Annotation 当成一个修饰符使用. 用于修饰它支持的程序元素
      三个基本的 Annotation:
        – @Override: 限定重写父类方法, 该注释只能用于方法
        – @Deprecated: 用于表示某个程序元素(类, 方法等)已过时
        – @SuppressWarnings: 抑制编译器警告.
    public class TestAnnotation {
        public static void main(String[] args) {          
            A a = new A();
            a.method2();            
        }
    }
    
    class A{    
        void method1(){}
        
        @Deprecated
        void method2(){}    //表示过期的方法,可以用,但是不建议使用
    }
    
    //在重载方法前面加上override,如果说自己在写重载方法时候不小心把方法名称写错了,比如写成了metode,这时候就会报错
    //注意观察重载方法在编译器里前面有一个小三角
    class B extends A{    
        @Override
        void method1(){}      
    }

      比如说我们在定义一个字符串String str = "abc";时,编译器会出现一个警告标志,提醒此变量未被用过,要消除此警告,把鼠标放在左侧边缘的警告处,添加:

    public class TestAnnotation {
        @SuppressWarnings("unused")
        public static void main(String[] args) {          
            String str = "abc";        
        }
    }

    自定义Annotation

      •定义新的 Annotation 类型使用 @interface 关键字
      •Annotation 的成员变量(属性)在 Annotation 定义中以无参数方法的形式来声明. 其方法名和返回值定义了该成员的名字和类型.
      •可以在定义 Annotation 的成员变量时为其指定初始值, 指定成员变量的初始值可使用 default 关键字
      •没有成员定义的 Annotation 称为标记; 包含成员变量的 Annotation 称为元数据 Annotation

      首先可以查看一下系统注解的定义

    //Override的定义
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Override {
    }
    
    
    //Target的定义
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.ANNOTATION_TYPE)
    public @interface Target {
        ElementType[] value();
    }

      然后我们自定义一个注解:

      使用这个注解:

    public class TestAnnotation {public static void main(String[] args) {          
           
        }
    }
    
    //可以用在类,方法....
    @HelloAnnotation(name="abc")
    class A{
        @HelloAnnotation()
        void method1(){}
    }
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Target;
    
    /**
     * 1. 使用 @interface 定义注解
     * 2. 使用类似于接口方法声明的方式来定义注解的属性: 其中返回值称为属性的类型, 方法名为属性的名称. 
     *
     */
    @Target(value={ElementType.METHOD, ElementType.TYPE})
    public @interface HelloAnnotation {
        
        public String name() default "atguigu";
    }

    提取Annotation 信息(与反射相关)

      •JDK 5.0 在 java.lang.reflect 包下新增了 AnnotatedElement 接口, 该接口代表程序中可以接受注释的程序元素
      •当一个 Annotation 类型被定义为运行时 Annotation 后, 该注释才是运行时可见, 当 class 文件被载入时保存在 class 文件中的 Annotation 才会被虚拟机读取
      •程序可以调用 AnnotationElement 对象的如下方法来访问 Annotation 信息

     

    JDK的元 Annotation

      JDK 的元 Annotation 用于修饰其他 Annotation 定义(即修饰注解的注解成为元注解)
          常见的元注解:
      •@Retention: 只能用于修饰一个 Annotation 定义, 用于指定该 Annotation 可以保留多长时间, @Rentention 包含一个 RetentionPolicy 类型的成员变量, 使用     @Rentention 时必须为该 value 成员变量指定值:
        –RetentionPolicy.CLASS: 编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 不会保留注释. 这是默认值
        –RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注释. 程序可以通过反射获取该注释
        –RetentionPolicy.SOURCE: 编译器直接丢弃这种策略的注释
      •@Target: 用于修饰 Annotation 定义, 用于指定被修饰的 Annotation 能用于修饰哪些程序元素. @Target 也包含一个名为 value 的成员变量.
    //只能用来修饰方法和类型(类也是一个类型)
    @Target(value={ElementType.METHOD, ElementType.TYPE})
    public @interface HelloAnnotation {
        
        public String name() default "atguigu";
    }

      •@Documented: 用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档.

      •@Inherited: 被它修饰的 Annotation 将具有继承性.如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注释


     

  • 相关阅读:
    fatal error LNK1123: 转换到 COFF 期间失败:文件无效或损坏
    CI:模拟进化与遗传算法
    贝叶斯网络
    朴素贝叶斯模型
    概率与不确定性(乘法法则与贝叶斯法则)
    关于“启发式”搜索的一个形象解释
    Python 字符串与数字拼接报错
    无法启动此程序因为计算机中丢失 xxx.dll
    Python 以指定的概率选取元素
    验证码之SimpleCaptcha (二)
  • 原文地址:https://www.cnblogs.com/tech-bird/p/3523290.html
Copyright © 2020-2023  润新知