Java注解

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。

<font color=blue>面试官</font>: 接下来,聊聊Java的注解,它们到底有什么用?

<font color=red>候选人:</font> 注解的用处主要三个: 第一个,编译期使用。比如@Override确保你正确重写了方法,@Deprecated表示这个方法以后可能会删掉。 第二个,运行期使用。很多框架通过反射来读注解,根据注解改变程序的行为。像Spring的@Autowired就是运行期读取的。 第三个, build tool用。很多构建工具会在构建代码时扫描和读取注解,根据注解做相应的操作。JUnit的@Test就是告诉测试运行器哪些是测试方法。

<font color=blue>面试官</font>:注解和注释有什么区别吧?

<font color=red>候选人:</font> 注释是写给人看的,注解是写给机器看的。注释不会对程序产生任何影响,注解会影响程序的编译、运行。注释是// 或者/* */,注解是@打头的。

<font color=blue>面试官</font>:举个自定义注解的例子?

<font color=red>候选人:</font> 这里有个自定义注解的示例:

//自定义注解 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnno { String name() default "Hello"; } //使用注解 public class MyClass { @MyAnno(name = "World") public void sayHello() { System.out.println("Hello World"); } } //读取注解 MyAnno anno = MyClass.class.getMethod("sayHello").getAnnotation(MyAnno.class); String name = anno.name(); // name = "World"

<font color=blue>面试官</font>:说说Spring中常见的注解?

<font color=red>候选人:</font> Spring中超级常用的注解有: @Component:把类标记为Spring的组件,用于组件扫描。 @Autowired:自动装配成员变量、构造方法和方法参数。 @Service:标记业务层组件。@Controller:标记控制层组件。 @Repository:标记数据访问组件。 @RequestMapping:映射请求URL到控制器处理方法。 @Configuration:标记配置类。 @Enable*:开启某个功能,比如@EnableTransactionManagement 开启事务功能。 这些注解大大简化了Spring的配置,真的很常用!

<font color=blue>面试官</font>:SpringBoot中常见的注解也说一下?

<font color=red>候选人:</font> SpringBoot中常用的注解有: @SpringBootApplication:标记这个类是SpringBoot的主配置类。 @Configuration:标记这个类是配置类。 @EnableAutoConfiguration:开启SpringBoot的自动配置。 @ComponentScan:开启组件扫描,找出应用相关的bean。 @RestController:标记这个控制器直接返回JSON或XML数据。 @RequestMapping:映射请求URL。 @Autowired:自动装配bean。 @Repository、@Service、@Controller:标记DAO、Service、Controller层的bean。 这些注解的作用和Spring差不多,只是在SpringBoot中简单了很多,几乎都可以不写XML配置了。

<font color=blue>面试官</font>:最后,AOP中的注解呢?

<font color=red>候选人:</font> AOP中最重要的注解有: @Aspect:标记一个切面。 @Pointcut:定义一个切点,可以是一个规则表达式,和@Before等注解搭配使用。 @Before:前置通知,在目标方法调用前执行。 @AfterReturning:后置通知,在目标方法正常返回后执行。
@AfterThrowing:异常通知,在目标方法抛出异常后执行。 @After:最终通知,无论目标方法是否正常完成都会执行。 @Around:环绕通知,手动控制目标方法调用时机。 这些AOP注解通过在方法上标记,就可以实现方法的切入、替换等,真正做到面向切面编程。

<font color=blue>面试官</font>:自定义注解需要什么?

<font color=red>候选人:</font> 自定义注解需要两个注解:@Target定义可以用于什么地方(方法、类等),@Retention定义注解的生命周期(编译期、运行期、源码)。然后使用@interface自定义注解,可以添加属性,默认值等。

<font color=blue>面试官</font>:注解的生命周期有几种?

<font color=red>候选人:</font> 注解生命周期有3种: 源码阶段:@Retention(RetentionPolicy.SOURCE),编译后失效。 编译阶段:@Retention(RetentionPolicy.CLASS),编译后存在于字节码文件中,运行时无法获得。 运行阶段:@Retention(RetentionPolicy.RUNTIME),编译后存在于字节码文件中,运行时可以通过反射获取。 大部分自定义注解都使用RUNTIME,以方便通过反射来读取和使用注解信息。

<font color=blue>面试官</font>:Enum中的注解呢?

<font color=red>候选人:</font> @Retention(RetentionPolicy.SOURCE)只存在于源码,编译后失效。 @Retention(RetentionPolicy.RUNTIME)会保留至运行时,可以通过反射读取。所以Enum中的注解一般使用RUNTIME。 枚举例子:

@Retention(RetentionPolicy.RUNTIME) @interface Color { ColorType value(); } public enum ColorType { @Color(ColorType.RED) RED, @Color(ColorType.GREEN) GREEN, @Color(ColorType.BLUE) BLUE }

<font color=blue>面试官</font>:注解在哪些地方可以使用?

<font color=red>候选人:</font> 注解可以放在: 类、接口、枚举上 字段、方法上 方法的参数上 局部变量上 构造器上 包上 所以注解的@Target有: ElementType.TYPE:接口、类、枚举、注解 ElementType.FIELD:字段、枚举的常量 ElementType.METHOD:方法 ElementType.PARAMETER:方法参数 ElementType.CONSTRUCTOR:构造器 ElementType.LOCAL_VARIABLE:局部变量 ElementType.PACKAGE:包 等等。

<font color=blue>面试官</font>:运行时注解的使用场景?

<font color=red>候选人:</font> 运行时注解主要有两大使用场景:

  1. 框架使用:很多框架使用运行时注解读取注解信息,调用相应的处理逻辑。如Spring使用@Autowired、@PostConstruct等实现依赖注入和初始化方法调用。
  2. 自定义注解:我们可以自定义运行时注解,在程序运行时通过反射读取注解,执行相应逻辑。比如:
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { } public class Main { @MyAnnotation public void doSomething() { // ... } }

然后通过反射调用:

Method m = Main.class.getMethod("doSomething"); MyAnnotation anno = m.getAnnotation(MyAnnotation.class); //执行相关逻辑

<font color=blue>面试官</font>:最后一个问题,注解有哪些限制?

<font color=red>候选人:</font> 注解有以下几个限制:

  1. 注解不能继承其他注解或接口。
  2. 注解只有成员变量,没有方法。
  3. 注解中的成员变量只能是基本类型、String、Enum、Annotation等,不能是对象。
  4. 如果注解有默认值,在使用注解时可以忽略该值。
  5. 同一个地方不能同时存在两个同名注解。
  6. 注解不能作用于变量、类的私有成员上。
  7. 注解不会继承,子类或者实现类无法继承父类或者接口的注解。

最近我在更新《面试1v1》系列文章,主要以场景化的方式,讲解我们在面试中遇到的问题,致力于让每一位工程师拿到自己心仪的offer,感兴趣可以关注公众号JavaPub追更!

🎁目录合集:

Gitee:https://gitee.com/rodert/JavaPub

GitHub:https://github.com/Rodert/JavaPub

http://javapub.net.cn

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

PPDB:今晚老齐直播

【今晚老齐直播】今晚(本周三晚)20:0021:00小白开始“用”飞桨(https://www.oschina.net/action/visit/ad?id1185)由PPDE(飞桨(https://www.oschina.net/action/visit/ad?id1185)开发者专家计划)成员老齐,为深度学习小白指点迷津。

VBox 启动虚拟机失败

在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern

FLV文件格式

1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.