课程没有说明怎么实现的
你是说为什么注解能做到这个吧。
官方定义的,类似于在代码中打一个标记,有分编译时和运行时。
对注解进行解析的代码在编译器和运行时中,简单说就是编译器和运行时发现类似的@xxx就看看是不是有对应的注解类型,有就对其进行相应的处理。
至于如何去找这个注解标记,那就去看看编译器和jvm的源码了,一般学习不用纠结。
就好比定义一个整型变量就是用int,这就是语法!
如果第三方的话,一般是属于运行时注解,通过反射调用的。即通过反射调用某个方法,加载某个类等等操作的时候,获取注解信息(反射api有提供方法获取),然后针对相应的注解进行处理。
- @Retention【关于注解的生命周期RetentionPolicy】
- .SOURCE,只保留在源文件层面,当.java被编译成.class的时候,此注解被丢弃
- .CLASS,(默认值)只保留在class文件,不会加载到jvm中。当jvm加载class文件的时候,此注解被丢弃
- .RUNTIME jvm加载被编译后的class文件后,此注解依然有效
- @Documented【javadoc 文档相关】
- @Target【指明了此注解用的范围,是个ElementType】
- TYPE :class,interface(当然也包括annotation 类型)
- FIELD:属性,包括一些枚举常量
- METHOD:方法
- PARAMETER:方法内参数
- CONSTRUSTOR:构造方法
- LOCAL_VARIABLE:局部变量
- ANNOTATION_TYPE:注解类型声明
- PACKAGE:包
- TYPE_PARAMETER:参数类型
- TYPE_USE
- @Inherited
- 在超类A的注解test被@Inherited注解后,该注解(test)被A'注解(@test),A'的子类就继承了超类A的注解。(前提是子类没有被任何注解应用)
- @Repeatable【多个属性值的注解】
- @Repeatable后面括号的类相当于一个容器注解