何为Annotation

  • Class的概念
    • Class是Java类的说明书
    • 你(通过反射)或者JVM阅读该说明书,创建类的实例
  • 注解就是说明书中的一小段信息/文本/标记
    • 可以携带参数
    • 可以在运行时被阅读
  • 一个简单的注解
    ```java package com.github.hcsp.generics;

public @interface MyAnnotation { }

  1. <a name="qHuRS"></a>
  2. ## 原注解
  3. - 注解上方的注解
  4. ```java
  5. import java.lang.annotation.ElementType;
  6. import java.lang.annotation.Target;
  7. // 只允许注解添加在方法和字段上
  8. @Target({ElementType.METHOD, ElementType.FIELD})
  9. public @interface MyAnnotation {
  10. }
  • 可设置注解是否在字节码中保留 ```java import java.lang.annotation.ElementType; import java.lang.annotation.Target;

// 只允许注解添加在方法和字段上 @Target({ElementType.METHOD, ElementType.FIELD}) // 注解会被编译器丢弃 @Retention(RetentionPolicy.SOURCE) public @interface MyAnnotation { }

  1. ![image.png](https://cdn.nlark.com/yuque/0/2019/png/128789/1577544327467-1ee90662-3c5a-419c-ac9c-3d664424eded.png#align=left&display=inline&height=336&name=image.png&originHeight=1096&originWidth=1558&size=109895&status=done&style=none&width=478)
  2. <a name="AnCUv"></a>
  3. ## 注解的属性
  4. - 可以有哪些
  5. - 基本数据类型
  6. - 类以及它们的数组
  7. - 默认值
  8. - 名为value的属性<br />
  9. ```java
  10. // 注解的属性
  11. @Target({ElementType.METHOD, ElementType.FIELD})
  12. public @interface SpringBootApp {
  13. String value() default "默认";
  14. String foo();
  15. }
  16. // 使用
  17. @SpringBootApp(value = {"默认", "value1", "value2"}, foo = "foo")
  18. public class Main {...}

JDK自带的注解

注解是如何工作的

  • 注解仅仅是一段信息,它自己无法工作
  • 没有东西处理它们的话,注解没有任何用处

通过反射获取注解

  • Method.getAnnotation
  • Class.getAnnotation

基于注解的日志实现

  • @Log注解
  • 在运行时,拦截方法的进入和退出,打印相应的日志
  • 使用ByteBuddy

基于注解的缓存实现

注解 Annotation - 图1