Java注解三连问

前言

注解的内容很多,本次的面试题讲解主要是针对以下几个问题:

1,注解是在编译期生效还是运行期生效?

2,有没有只在编译期生效的注解?

3,编译期生效的注解和运行期生效的注解有什么区别?

我们的分析如下:

首先,第一个问题是给面试者挖坑,两者都存在,关键看注解的定义描述;

其次,第二个问题是有,比如我们JDK默认提供注解@Oerride

我们观察其注解的定义如下

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {}

上面的两个注解说明做下解释:

@Target(ElementType.METHOD) :表示该注解可以放在方法的定义上

@Retention(RetentionPolicy.SOURCE) : 表示该注解在编译期有效

那什么是编译期有效?

就好比我们说的@Oerride,它的作用就是在编译期间,检查我们重写的代码有没有符合语法规则,如果不符合就会通过红线报错,编译失败,而真正到运行期间就没有作用了

最后,说第三个问题

就是运行期的注解有什么用,其实我们用过的很多框架,他们都会提供注解,这些都不是JDK提供的注解,我们统称为自定义注解

比如Springweb提供的

@RestController

我们观察其注解的定义说明如下:

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
}

我们可以看到其关键点的描述为:

@Retention(RetentionPolicy.RUNTIME) : 表示是运行期有效

为什么需要定义为运行期有效?

大家想想,我们创建Controller是不是在服务运行期间才正式对外提供服务的,而Spring容器需要去检查到底哪些Controller可以对外提供服务,那么以这个自定义注解为暗号,一看,咦,你小子有这个注解,行了,你就是可以对外提供服务的人,所以注解必须是在运行期间有效

希望对大家有所帮助!

猜你喜欢

转载自blog.csdn.net/quxuetrip/article/details/131897066