自定义注解
1,注解是在编译期生效还是运行期生效? 两者都存在
2,有没有在编译期生效的注解?@Override
3,编译期生效的注解和运行期生效的注解有什么区别?
我们的分析如下:
首先,第一个问题是给面试者挖坑,两者都存在,关键看注解的定义描述;
其次,第二个问题是有,比如我们JDK默认提供注解@Override
我们观察其注解的定义如下
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
上面的两个注解说明做下解释:
@Target(ElementType.METHOD) :表示该注解可以放到方法的定义上
@Retention(RetentionPolicy.SOURCE) : 表示该注解在编译期有效
那什么是编译期有效?
就好比我们说的@Override,它的作用就是在编译期间,检查我们重写的代码有没有符合语法规则,如果不符合就会通过红线报错,编译失败,而真正到运行期间就没有作用了
最后,说第三个问题
就是运行期的注解有什么用,其实我们用过的很多框架,他们都会提供注解,这些都不是JDK提供的注解,我们统称为自定义注解
比如Springweb提供的
@RestController
我们观察其注解的定义说明如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
我们可以看到其关键点的描述为:
@Retention(RetentionPolicy.RUNTIME) : 表示是运行期有效
为什么需要定义为运行期有效?
大家想想,我们创建Controller是不是在服务运行期间才正式对外提供服务的,而Spring容器需要去检查到底哪些Controller可以对外提供服务,那么以这个自定义注解为暗号,一看,咦,你小子有这个注解,行了,你就是可以对外提供服务的人,所以注解必须是在运行期间有效