初级工程师都懂得 Java 注解

简介: 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"
AI 代码解读

面试官:说说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
}
AI 代码解读

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

候选人: 注解可以放在:
类、接口、枚举上
字段、方法上
方法的参数上
局部变量上
构造器上
包上
所以注解的@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() {
   
   
        // ...
    }
}
AI 代码解读

然后通过反射调用:

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

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

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

  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

目录
相关文章
Java工程师如何理解张量?
刚接触AI和PyTorch,理解“张量(Tensor)”是入门关键。张量可类比为Java中的多维数组,但更强大,尤其在AI领域支持GPU加速、自动求导等特性。它不仅能高效存储数据,还能进行复杂运算,是深度学习的核心数据结构。掌握张量的维度、数据类型及GPU加速特性,对学习PyTorch至关重要。
35 3
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
85 7
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
142 5
|
3月前
|
Java进阶之标准注解
Java进阶之标准注解
55 0
[Java]自定义注解
本文介绍了Java中的四个元注解(@Target、@Retention、@Documented、@Inherited)及其使用方法,并详细讲解了自定义注解的定义和使用细节。文章还提到了Spring框架中的@AliasFor注解,通过示例帮助读者更好地理解和应用这些注解。文中强调了注解的生命周期、继承性和文档化特性,适合初学者和进阶开发者参考。
111 14
|
4月前
|
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
124 43
Java学习十六—掌握注解:让编程更简单
java的反射与注解
java的反射与注解
36 0
Java-spring注解的作用
Java-spring注解的作用
38 0
java 常用注解大全、注解笔记
关于Java常用注解的大全和笔记,涵盖了实体类、JSON处理、HTTP请求映射等多个方面的注解使用。
78 0
java 常用注解大全、注解笔记
Java注解,元注解,自定义注解的使用
本文讲解了Java中注解的概念和作用,包括基本注解的用法(@Override, @Deprecated, @SuppressWarnings, @SafeVarargs, @FunctionalInterface),Java提供的元注解(@Retention, @Target, @Documented, @Inherited),以及如何自定义注解并通过反射获取注解信息。
Java注解,元注解,自定义注解的使用