《面试1v1》java注解

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

面试官:接下来,聊聊Java的注解,它们到底有什么用?

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

面试官:注解和注释有什么区别吧?

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

面试官:举个自定义注解的例子?

候选人: 这里有个自定义注解的示例:

//自定义注解
@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"

面试官:说说Spring中常见的注解?

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

面试官:SpringBoot中常见的注解也说一下?

候选人: 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配置了。

面试官:最后,AOP中的注解呢?

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

面试官:自定义注解需要什么?

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

面试官:注解的生命周期有几种?

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

面试官:Enum中的注解呢?

候选人: @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
}

面试官:注解在哪些地方可以使用?

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

面试官:运行时注解的使用场景?

候选人: 运行时注解主要有两大使用场景:

  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);
//执行相关逻辑

面试官:最后一个问题,注解有哪些限制?

候选人: 注解有以下几个限制:

  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://www.mfbz.cn/a/13394.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue 条件语句

文章目录 Vue 条件语句条件判断v-ifv-elsev-else-ifv-show Vue 条件语句 条件判断 v-if 条件判断使用 v-if 指令&#xff1a; v-if 指令 在元素 和 template 中使用 v-if 指令&#xff1a; <div id"app"><p v-if"seen">现在你看到我了<…

自阿里P8爆出内部1031道java面试题后,在Boss直聘狂拿千份Offer

开始之前我问大家几个问题&#xff0c;看大家是如何思考的&#xff1a; 1.程序员一定要去一线城市漂泊吗&#xff1f;在自己家乡如何拿到一份满意的薪水&#xff1f; 2.程序员被裁员、找不到工作&#xff0c;代表什么&#xff1f; 3.程序员一定要进一线大厂吗&#xff1f;你…

LeetCode热题HOT100:单词拆分、环形链表 II、LRU 缓存

LeetCode热题HOT100 139. 单词拆分 题目&#xff1a;给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xf…

一个从培训学校走出来的测试工程师自述....

简单介绍一下我自己&#xff0c;1997年的&#xff0c;毕业一年了&#xff0c;本科生&#xff0c;专业是机械制造及其自动化。 在校度过了四年&#xff0c;毕业&#xff0c;找工作&#xff0c;填三方协议&#xff0c;体检&#xff0c;入职。我觉得我可能就这么度过我平平无奇的…

D. Ehab and the Expected XOR Problem(构造 + 异或和)

Problem - D - Codeforces 给出两个整数nn和xx&#xff0c;构造一个满足以下条件的数组&#xff1a; 对于数组中的任何元素aiai&#xff0c;1≤ai<2n1≤ai<2n&#xff1b; 没有非空的子段&#xff0c;其位数XOR值等于00或xx、 它的长度ll应该是最大的。 一个序列bb是一个…

Spring更简单的读取和存储对象

1.存储对象 通过注解来替代配置&#xff0c;依然需要配置扫描包的类对象 1.配置扫描路径 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001…

Amazon Linux2部署安装Jenkins

先决条件 服务器配置要求 256 MB of RAM 1 GB of drive space (although 10 GB is a recommended minimum if running Jenkins as a Docker container) 需要部署安装JDK环境部署安装的Jenkins版本为Version 2.400 部署安装JDK 1. 下载JDK软件包 wget https://corretto.aws/…

c++积累11-强制类型转换运算符(static_cast/reinterpret_cast/const_cast/dynamic_cast)

1、背景 将类型名作为强制类型转换运算符的做法是C语言的老式做法&#xff0c;C为保持兼容而予以保留。强制类型转换是有一定风险的&#xff0c;C引入新的转换机制&#xff0c;主要为了客服C语言转换的三个缺点&#xff1b; 1、没有从形式上体现转换功能和风险的不同。 例如&a…

深度强化学习——第一次知识小结(3.5)

一、策略网络的小结&#xff1a; 重要概念回顾&#xff1a; 1、动作价值函数QΠ(st,at) 动作价值函数是未来奖励总和Ut的条件期望&#xff0c;如果已知了策略函数Π与当前的状态st&#xff0c;QΠ就可以对所有的动作a打分&#xff0c;以此来决定选择哪个a 其实顾名思义就是…

【分布式版本控制系统Git】| 国内代码托管中心-Gitee、自建代码托管平台-GitLab

目录 一&#xff1a;国内代码托管中心-码云 1. 码云创建远程库 2. IDEA 集成码云 3. 码云复制 GitHub 项目 二&#xff1a;自建代码托管平台-GitLab 1. GitLab 安装 2. IDEA 集成 GitLab 一&#xff1a;国内代码托管中心-码云 众所周知&#xff0c;GitHub 服务器在国外&…

二:伙伴系统

内核空间内存分配 目录 内核空间内存分配 伙伴系统 首先从内核空间开始&#xff0c;讲解内存管理模式。 主要分为三种方式&#xff1a; 这篇文章我们集中注意于伙伴系统 伙伴系统 解决了外部碎片问题&#xff0c;针对大块内存分配设计 Linux中的内存管理的“页”大小为4…

第三章(4):自然语言处理入门

第三章&#xff08;4&#xff09;&#xff1a;自然语言处理入门 在本节中&#xff0c;我们将在简单文本数据上&#xff08;例如一个句子上&#xff09;&#xff0c;执行一系列基本操作&#xff0c;来帮助你熟悉NLP的工作原理&#xff0c;其中一些技术在第三章&#xff08;2&…

SLIC超像素分割算法

SLIC超像素分割算法 《SLIC Superpixels》 摘要 超像素在计算机视觉应用中越来越受欢迎。然而&#xff0c;很少有算法能够输出所需数量的规则、紧凑的超级像素&#xff0c;并且计算开销低。我们介绍了一种新的算法&#xff0c;将像素聚类在组合的五维颜色和图像平面空间中&a…

腾讯云COS+SpringBOot实现文件上传下载功能

文章目录 第一步&#xff1a;在.yml文件中配置对应秘钥内容第二步&#xff1a;完成COSConfig类编写第三步&#xff1a;编写Controller类Bug提示&#xff1a; 最近一直在做一个项目&#xff0c;需要支持视频&#xff0c;音频&#xff0c;图片的上传&#xff0c;前面介绍的都是把…

2023年制造业产品经理考NPDP有什么用?

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

beef-xss浏览器劫持

beef-xss浏览器劫持 一&#xff0c;实验拓扑图二&#xff0c;租用一台阿里云&#xff0c;搭建docker环境和beef环境1.租一台阿里云服务器&#xff0c;系统选用ubuntu&#xff0c;计时收费的那种&#xff0c;一个小时几毛钱2.开启策略组3000端口&#xff0c;5000端口4.安装docke…

交友项目【查询好友动态,查询推荐动态】实现

目录 1&#xff1a;圈子 1.1&#xff1a;查询好友动态 1.1.1&#xff1a;接口分析 1.1.2&#xff1a;流程分析 1.1.2&#xff1a;代码实现 1.2&#xff1a;查询推荐动态 1.2.1&#xff1a;接口分析 1.2.2&#xff1a;流程分析 1.2.3&#xff1a;代码实现 1&#xff1a…

十五分钟带你学会 Electron

文章目录 什么是 Electron为什么要选择 Electron安装 Electron桌面CSDN实战Electron 基础配置Electron 进程主进程渲染进程主进程与渲染进程的区别主进程与渲染进程的通信 Electron 跨平台问题Electron 部署打包应用程序发布应用程序 Electron 跨端原理总结 什么是 Electron E…

数据库实验 | 第1关:建立和调用存储过程(不带输出参数的存储过程)

任务描述 本关任务&#xff1a; 该实验是针对数据表jdxx&#xff0c;该数据表有四个字段&#xff0c;分别是省份(sf)、城市(cs)、区县(qxmc)、街道(name)。 例如&#xff0c;查询天心区(qxmc)的所有字段的值结果如图所示 任务要求 建立存储过程 dqxx(in city varchar(10),i…

QT QPainter坐标系统和坐标变换

一、坐标变换函数 QPainter 在窗口上绘图的默认坐标系统如图下图所示&#xff0c;这是绘图设备的物理坐标。为了绘图的方便&#xff0c;QPainter 提供了一些坐标变换的功能&#xff0c;通过平移、旋转等坐标变换&#xff0c;得到一个逻辑坐标系统&#xff0c;使用逻辑坐标系统…
最新文章