美文网首页
Java注解annotation学习记录

Java注解annotation学习记录

作者: 峰_d0c7 | 来源:发表于2019-12-09 14:05 被阅读0次

    一、注解概念:

    注释:给人看的信息,人看了提示信息了解程序的内容。 eg: //  /* */ /** */

    注解:给程序看的提示信息,JDK1.5开始提供的新特性。程序看后可根据有无注解及注解上属性的不同配置执行不同的逻辑。 Java中的注解格式:@AnnoName(key = value, ...)

    *注解在开发中,可以作为轻量级配置来使用,比起实用xml作为配置文件,更加的轻便易用,在Java开发中大量使用。 --- @Bean  @Select  @Resource ...

    二、jdk三种内置注解:

    1.@Override:声明重写父类方法的注解,要求编译器帮我们检查是否成功的覆盖,如果没有成功覆盖方法,编译器将会进行报错提示。

    2.@Deprecated:声明方法被过时,不再建议使用,要求编译器在编译的过程中对于这样的方法的调用提出警告,提示方法过时。

    3.@SuppressWarnings:压制警告,提示编译器,在编译的过程中对指定类型的警告不再提示。 --- 自动忽略警告

    三、自定义注解开发:

    四、元注解:给注解 注解 的 注解

    1.开发一个注解类,非常类似于开发一个接口,只不过需要通过@interface关键字来声明。 

        eg: public @interface log{  }

    2.使用元注解修饰注解的声明:所谓的元注解是用来修饰注解声明的注解,可以控制被修饰的注解的特性。

    a.@Target:被修饰的注解可以用在什么位置。

        @Target(ElementType.TYPE)——接口、类、枚举、注解

        @Target(ElementType.FIELD)——字段、枚举的常量

        @Target(ElementType.METHOD)——方法

        @Target(ElementType.PARAMETER)——方法参数    

        @Target(ElementType.CONSTRUCTOR) ——构造函数

        @Target(ElementType.PACKAGE)——包

    可以修饰多个位置@Target({ ElementType.METHOD, ElementType.TYPE }) 其中@Target( ElementType.PACKAGE)是注解在package-info.java中的。package-info.java详细说明

    b.@Retention:用来声明被修饰的注解会被保留到什么阶段。

        @Retention(RetentionPolicy.SOURCE):注解在源码时有效,将会被编译器抛弃。

    SOURCE一般用于标记,比如javadoc,或为了其他人易于理解你的程序,如@Override。

        @Retention(RetentionPolicy.CLASS):注解在编译时有效,但在运行时没有保留。这也是默认行为。class文件中保留注解

        @Retention(RetentionPolicy.RUNTIME):运行时有效,并且可以通过反射获取。

    class文件里面的东西由类加载器加载到内存中去,类加载器在加载class文件时,会对class文件里面的东西进行处理,如安全检查,处理完以后得到的最终在内存中的二进制的东西才是字节码,类加载器在把class文件加载到内存中时也有转换,转换时是否把class文件中的注解保留下来?class范围不保留,runtime则保留

        这3个生命周期分别对应于:Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码。

    运行时注解是通过反射来实现注解处理器的,对性能稍微有一点损耗,而编译时注解是在程序编译期间生成相应的代理类,替我们完成某些功能。

    c.@Documented:用来声明被修饰注解是否要被文档提取工具提取到文档中。默认不提取。

    @Documented 可以被例如 javadoc此类的工具文档化,Documented是一个标注注解,没有成员

    d.@Inherited:被修饰的注解是否有继承性。默认没有继承性

    使用两个类继承验证@Inherited 结论:类继承关系中,子类会继承父类使用的注解中被@Inherited修饰的注解 接口继承接口验证@Inherited 类实现接口验证@Inherited 结论:接口继承关系中和实现接口关系中,子接口(子类)不会继承/实现父接口中的任何注解,不管父接口中使用的注解有没有被@Inherited修饰

    3.为注解增加属性:注解类中声明的属性必须是public的,可以显示声明,也可以不声明,不声明默认就是public的

    注解类中的属性只能是八种基本数据类型、String类型、Class类型、枚举类型、其它注解类型及以上类型的一维数组

    注解中声明的属性,需要在注解时为其赋值,赋值的方式就是在使用注解时,在注解后跟一对小括号,在其中通过 属性名=属性值 的方式指定属性的值

    也可以在声明注解时,在注解的属性后通过 default关键字 声明属性的默认值,声明过默认值的属性,在使用注解时不指定属性则使用默认值,如果指定,则覆盖默认值

    如果属性是 一维数组类型 而在传入的数组中 只有一个值 则包括数组的大括号可以省略

    如果注解的属性 只有一个需要赋值 且该属性的名称叫做value 则在使用注解时 value= 可以不写

    五、反射注解:

    1.原理:RententionPolicy.RUNTIME级别的注解回保留到运行期,可以通过反射技术获取,从而可以根据是否有注解 或 注解属性值的不同控制程序按照不同方式运行

    a.isAnnotationPresent():如果指定类型的注释存在此元素上,则返回true,否则返回false

    b.getAnnotation():如果存在该元素的指定类型的属性值,则返回这些属性,否则返回null

    c.getAnnotations():返回此元素上存在的所有属性值

    六、Spring的五大通知类型

    a. 前置通知 @Before:在目标方法执行之前执行执行的通知

    b. 环绕通知 @Around:在目标方法执行之前和之后都可以执行额外代码的通知。

    c. 后置通知 @AfterReturning:在目标方法执行之后执行的通知。

    d. 异常通知 @AfterThrowing:在目标方法抛出异常时执行的通知

    e. 最终通知 @After:是在目标方法执行之后执行的通知。

    eg:

    无异常情况下:

    有异常情况下

    相关文章

      网友评论

          本文标题:Java注解annotation学习记录

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