Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。
例如: @Override 复写方法 @Deprecated 过时的方法,不建议使用,但目前仍然支持,后期版本可能删除 @SuppressWarnings(value = "unchecked") 压制编辑器警告
元注解用于修饰其他的注解
@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(有成员变量)。
通过使用AnnotatedElement接口中的方法提取注解中的数据,Class/Constructor/Field/Method/Package这些类都实现了AnnotatedElement接口。 注意:只有当定义Annotation时使用了@Retention(RetentionPolicy.RUNTIME)修饰,JVM才会在装载class文件时提取保存在class文件中的Annotation,该Annotation才会在运行时可见,这样我们才能够解析
主要方法:
示例:
- //定义注解具有集成性
- @Inherited
-
- //保留策略为运行时
- @Retention(RetentionPolicy.RUNTIME)
-
- //可以用在方法和类型上
- @Target({ElementType.METHOD, ElementType.TYPE})
- public @interface Tag {
-
- //成员变量
- String name() default "rose";
-
- String description() default "beautiful girl";
- }
本例通过自定义的注解类来实现一个简单的日志打印功能。用于演示自定义注解的基本用法。
使用拦截器对注解进行处理:
上面这种方式 适用与cjlib
jdk 接口获取参数方式 需要改为
- @Around("@annotation(com.baidu.redis.annotation.MyLog)")
- public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
- log.info("MyLog info ,,,,,");
-
- Class> aClass = joinPoint.getTarget().getClass();
-
- Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
- Method method1 = aClass.getMethod(method.getName(), method.getParameterTypes());
- MyLog annotation = method1.getAnnotation(MyLog.class);
-
- log.info("value=" + annotation.value());
-
- Object proceed = joinPoint.proceed();
- return proceed;
-
- }
定义一个使用注解的方法:
使用注释时可能会出现 嵌套环绕现象 问题:嵌套后有一个会失效
在这里我们就需要添加 注解 Order(顺序) 加一个运行顺序