• JAVA注解


    1. 什么是java注解

    Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。

    2. java注解的分类

    2.1 JDK基本注解

    例如: @Override 复写方法 @Deprecated 过时的方法,不建议使用,但目前仍然支持,后期版本可能删除 @SuppressWarnings(value = "unchecked") 压制编辑器警告

    2.2 JDK元注解

    元注解用于修饰其他的注解

    @Retention:定义注解的保留策略

    注解作用
    @Retention(RetentionPolicy.SOURCE)注解仅存在于源码中,在class字节码文件中不包含
    @Retention(RetentionPolicy.CLASS)默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,请注意,当注解未定义Retention值时,默认值是CLASS,如Java内置注解,@Override、@Deprecated、@SuppressWarnning等
    @Retention(RetentionPolicy.RUNTIME)注解会在class字节码文件中存在,在运行时可以通过反射获取到

    @Target:指定被修饰的Annotation可以放置的位置(被修饰的目标)

    注解作用
    @Target(ElementType.TYPE)接口、类
    @Target(ElementType.FIELD)属性
    @Target(ElementType.METHOD)方法
    @Target(ElementType.PARAMETER)方法参数
    @Target(ElementType.CONSTRUCTOR)构造函数
    @Target(ElementType.LOCAL_VARIABLE)局部变量
    @Target(ElementType.ANNOTATION_TYPE)注解
    @Target(ElementType.PACKAGE)包

    可以指定多个位置:如@Target({ElementType.METHOD, ElementType.TYPE}),也就是此注解可以在方法和类上面使用

    @Inherited:指定被修饰的Annotation将具有继承性,但这并不是真的继承,只是通过使用@Inherited,可以让子类Class对象使用getAnnotations()获取父类被@Inherited修饰的注解 @Documented:指定被修饰的该Annotation可以被javadoc工具提取成文档.

    注:根据Annotation中是否包含成员变量,Annotation可以分为:标记Annotation(无成员变量), 元数据Annotation(有成员变量)。

    2.3 注解与反射机制

    通过使用AnnotatedElement接口中的方法提取注解中的数据,Class/Constructor/Field/Method/Package这些类都实现了AnnotatedElement接口。 注意:只有当定义Annotation时使用了@Retention(RetentionPolicy.RUNTIME)修饰,JVM才会在装载class文件时提取保存在class文件中的Annotation,该Annotation才会在运行时可见,这样我们才能够解析

    主要方法:

    返回值方法名作用
    getAnnotation(Class annotationClass)返回该程序元素上存在的、指定类型的注释,如果该类型的注释不存在,则返回null
    Annotation[]Annotation[] getAnnotations()返回该程序元素上存在的所有注释
    booleanboolean isAnnotationPresent(Class annotationClass)判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false
    Annotation[]getDeclaredAnnotations()返回直接存在于此元素上的所有注解,注意,不包括父类的注解,调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响,没有则返回长度为0的数组

    3. 自定义注解

    3.1 自定义注解语法

    示例:

    1. //定义注解具有集成性
    2. @Inherited
    3. ​
    4. //保留策略为运行时
    5. @Retention(RetentionPolicy.RUNTIME)
    6. ​
    7. //可以用在方法和类型上
    8. @Target({ElementType.METHOD, ElementType.TYPE})
    9. public @interface Tag {
    10.    
    11.   //成员变量
    12.     String name() default "rose";
    13.    
    14.     String description() default "beautiful girl";
    15. }

    3.2 自定义注解示例

    本例通过自定义的注解类来实现一个简单的日志打印功能。用于演示自定义注解的基本用法。

    3.2.1 定义注解

     

    3.2.2 拦截器

    使用拦截器对注解进行处理:

     

    上面这种方式 适用与cjlib

    jdk 接口获取参数方式 需要改为

    1. @Around("@annotation(com.baidu.redis.annotation.MyLog)")
    2. public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
    3. log.info("MyLog info ,,,,,");
    4. ​
    5.     Class aClass =  joinPoint.getTarget().getClass();
    6. ​
    7.     Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
    8.     Method method1 = aClass.getMethod(method.getName(), method.getParameterTypes());
    9.     MyLog annotation = method1.getAnnotation(MyLog.class);
    10. ​
    11.     log.info("value=" + annotation.value());
    12. ​
    13.     Object proceed = joinPoint.proceed();
    14.     return  proceed;
    15. ​
    16. }

    3.3.3 使用注解

    定义一个使用注解的方法:

     

    3.3.4 测试

     

    4.使用aop环绕通知需要注意的点

    使用注释时可能会出现 嵌套环绕现象 问题:嵌套后有一个会失效

    在这里我们就需要添加 注解 Order(顺序) 加一个运行顺序

     

  • 相关阅读:
    mybatis自定义注解+拦截器实现自定义方法拦截
    数字孪生与元宇宙相比有何区别?
    深度链接和延迟深度链接的学习
    题目 1009: [编程入门]数字的处理与判断(python详解)——练气二层后期
    Spring的简单使用(3)
    Tarjan—离线求LCA
    爬虫兽问题解答1-抖音评论区爬虫采集拓客系统
    2023年【安全员-B证】新版试题及安全员-B证免费试题
    c盘满了怎么迁移软件到其他盘,c盘变红了文件怎么迁移
    计算机视觉全系列实战教程:(八)图像变换-点运算、灰度变换、直方图变换
  • 原文地址:https://blog.csdn.net/qq_62898618/article/details/127833331