Java注解(3)注解的原理
1.注解的声明周期:
一般如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解,比如@Deprecated使用RUNTIME注解
如果要在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife),就用 CLASS注解;
如果只是做一些检查性的操作,比如 @Override 和 @SuppressWarnings,使用SOURCE 注解。
2.编译期注解的原理
由编译期扫描到有@Override等注解的类,在编译器的注解处理器进行代码检查。检查涉及到的原理为APT技术。
3.运行时注解的原理:
以Spring中的@Component注解为例:
所有“继承”了@Component注解接口的注解修饰用户的类,会被Spring中的注解处理器获取(通过getAnonations()).
判定存在@Component注解后,注解处理器会在spring容器框架中,根据用户类的全限定名,通过java的反射机制创建这个用户类的对象,并放到spring容器框架中进行管理。
4.注解处理器(Annotation Processor)
首先来了解下什么是注解处理器,注解处理器是javac的一个工具,它用来在编译时扫描和处理注解(Annotation)。可以自定义注解,并注册到相应的注解处理器,由注解处理器来处理你的注解。
一个注解的注解处理器,以Java代码(或者编译过的字节码)作为输入,生成文件(通常是.java文件)作为输出。这些生成的Java代码是在生成的.java文件中,所以你不能修改已经存在的Java类,例如向已有的类中添加方法。这些生成的Java文件,会同其他普通的手动编写的Java源代码一样被javac编译。
自定义注解处理器