《面试1v1》java注解

news2024/12/22 19:11:39

我是 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.coloradmin.cn/o/450841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

activeMQ持久化报错的问题

activeMQ持久化,启动activeMQ报错, INFO | Using Persistence Adapter: JDBCPersistenceAdapter(org.apache.commons.dbcp2.BasicDataSource5148e82a) jvm 1 | WARN | Could not get JDBC connection: Cannot create PoolableConnectionFactory (Commun…

matlab点云的可视化-源码复制粘贴即可(一)

一、导入并可视化一个无属性的点云 clc; clear; close; % clear everything% Import a point cloud from a plain text file (run type(Lion.xyz) to see the contents of the file) pc pointCloud(Lion.xyz);% Generate a z-colored view of the point cloud pc.plot;% Set …

加密解密软件VMProtect入门使用教程(二):分析、破解和保护软件

VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic(本机)、Virtual Pascal和XCode编译器。 同时,VMProtect有一个内置的反汇编程序,可以与Windows和Mac OS X可执行文件一起…

Vue ElementUI Axios 前后端案例(day03) 之 Axios

前置知识 AJAX 前置知识 答疑 问:我们是否可以这么理解,发送url请求就是服务器之间建立连接,tcp三次握手之后 其中与服务器进行数据交换:通过AJAX可以给服务器发送请求 就是连接建立以后 我们发送我们的浏览器数据 就是所谓的…

家用洗地机有什么优缺点?入门级家用洗地机

家用清洁产品近几年发展迅猛,扫拖机器人、洗地机等热门品类更是在家电产品销量普遍下滑的趋势下,仍然保持着大幅增长。越来越多的消费者开始关注清洁类产品,但扫拖机器人和吸尘器的清洁效果有限,洗地机会在功能上更加的完善&#…

2023年全国职业院校技能大赛软件测试赛题第1套

2023年全国职业院校技能大赛 软件测试赛题第1套 赛项名称: 软件测试 英文名称: Software Testing 赛项编号: GZ034 归属产业: 电子与信息大类 …

通过适当的异常处理进行快速调试

编写良好的代码和异常处理 作为开发人员,开发中最令人恼火的部分通常是调试。与我共事过的大多数程序员都会赞同这种观点。通常,看到异常的第一反应是烦恼和沮丧的混合。易于调试的异常通常会在调试后的几分钟内产生根本原因。最让我烦恼的是那些在系统…

vue实现多布局模式

1、目标效果 源码地址:multipal-layout-demo: vue2实现多布局暗黑模式 默认布局:头部宽度100%,侧边栏、内容区 顶部布局:头部宽度100%,内容区 侧边栏布局:侧边栏高度100%,头部、内容区 2、原理…

python+vue课堂教学效果实时评价系统

系统权限按管理员,教师和学生这三类涉及用户划分。 (a) 管理员;管理员使用本系统涉到的功能主要有:个人中心,学生管理,教师管理,教学视频管理,教学课件管理,类型管理,视频…

ArcGIS Pro导航工具

主要导航工具为浏览工具 、屏幕导航器 、书签 、转到XY工具 。 其它还包括链接视图、地图比例(2D)、场景高度(3D)、暂停并刷新绘制、照相机属性、在3D模式下导航、键盘快捷键等。 1 主要导航工具 地图和场景的默认工具为浏览工具…

【python视图3】networkx图操作示例

一、说明 根据定义,图是节点(顶点)以及已识别的节点对(称为边、链接等)的集合。在 NetworkX 中,节点可以是任何可哈希对象,例如文本字符串、图像、XML 对象、另一个图形、自定义节点对象等。 如…

如何区分高压和低压电阻接地系统

电阻接地系统或电阻接地中性线系统是通过一个或多个电阻在中性线和大地之间有意连接的系统。在这些系统中,接地故障期间造成的损坏远小于在牢固接地系统中接地故障期间造成的损坏,并且设备上的机械应力也大大降低。 电阻通常具有比接近接地点的系统电抗…

WIN10-22H2专业版_电脑维修人员专用装机系统镜像【04.20更新】

WIN10-22H2专业版是由站长亲自封装的电脑维修人员专用装机系统镜像,系统干净无广告,稳定长效不卡顿,适合电脑维修店用来维修电脑重装系统。此版本是WIN10系统里非常稳定的正式版本之一,适合在维修电脑时重装系统或者大批量装机使用…

2023-spring 1. 补给马车

🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 一、🌱2023-spring 1. 补给马车 题目描述:远征队即将开启未知的冒…

防晒服饰赛道持续加速扩容 未来行业集中度有望进一步提升

一、防晒服饰行业概述 国内防晒服饰市场主要包括具有防晒功能的衣服、伞具、帽子、墨镜、口罩、面罩、披肩、袖套及手套等产品。相比较防晒护肤品需要定时补涂、具有过敏风险、防晒效果欠佳以及消耗量大的缺陷,防晒服饰具有覆盖面广、使用方便、防晒效果好、对身体…

ChatGPT: 如何利用OpenAI的GPT-3.5构建智能对话助手

ChatGPT: 如何利用OpenAI的GPT-3.5构建智能对话助手 GPT-3.5:OpenAI的语言模型在自然语言处理领域的重要地位和应用潜力 GPT-3.5是OpenAI开发的一种强大的语言模型,具有广泛的应用潜力和在自然语言处理领域的重要地位。作为OpenAI最新一代的语言模型&…

初识C++之C++11

目录 一、C11的概念 二、统一的列表初始化 1.{ }初始化 2.initializer_list 三、decltype 四、lambda表达式 1. lambda表达式的出现原因 2. lambda表达式的使用 2.1 捕捉列表 2.2 参数列表 2.3 mutable 2.4 返回值类型 2.5 函数体 2.6 使用方式 3. lambda表达式…

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

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

LeetCode特训 --- Week2 (主打滑动窗口 + 字符串匹配题目)

目录 滑动窗口原理 真懂了滑动窗口? 滑动 字符串细节 开干切题 滑动窗口原理 滑动窗口:维护一前一后两根指针, 或者说一左一右两个指针。更主要的是维护左右指针中的区间. 同时不断的向前滑动,直到整个序列滑动结束,前指针走到序列末尾…

总结:Grafana Mimir调用

一、背景 Prometheus单实例,可用性低,可靠性低,不能存储更多数据。 解决业务问题 如:当前QKE是一个集群一个项目一个prometheus实例,那么当我一个应用分多个集群部署的时候,查询数据时就得从三个promethe…