Java中的注解(Annotation)_Java中的注解是怎么实现的

createh54周前 (02-18)技术教程13

Java中的注解(Annotation)

Java中的注解是一种元数据形式,它为程序元素(如类、方法、变量等)提供额外的信息。注解本身不会直接影响代码的执行,但可以通过反射机制或编译器插件来读取这些注解,并根据它们的行为进行相应的处理。

1. 内置注解

Java提供了几个内置的注解:

  • @Override:用于标记一个方法是重写父类的方法。如果该方法并未重写任何父类方法,则编译时会报错。
  • @Deprecated:用于标记一个类、方法或字段已经过时,不推荐使用。编译器会发出警告。
  • @SuppressWarnings:用于抑制编译器警告信息,可以指定要忽略的警告类型。
  • @SafeVarargs:用于标记泛型方法或构造函数的安全性,避免在使用变长参数时产生警告。
  • @FunctionalInterface:用于标记一个接口是函数式接口(只有一个抽象方法的接口),便于编译器检查。

2. 自定义注解

你可以通过定义自己的注解来扩展功能。自定义注解需要使用 @interface 关键字。

java public @interface MyAnnotation { String value() default "default value"; }

3. 注解的应用场景

  • 元数据:如JPA中的 @Entity 和 @Table,用于描述实体类和数据库表之间的映射关系。
  • 依赖注入:如Spring中的 @Autowired,用于自动装配依赖对象。
  • 配置管理:如Spring Boot中的 @Configuration 和 @Bean,用于声明配置类和bean。
  • 验证:如Hibernate Validator中的 @NotNull 和 @Size,用于验证输入数据的有效性。
  • 测试框架:如JUnit中的 @Test 和 @Before,用于标记测试方法和前置操作。

4. 元注解

元注解是用来标注其他注解的注解,常见的元注解有:

  • @Retention:指定注解的生命周期。可选值包括:
  • RetentionPolicy.SOURCE:仅保留在源文件中,编译后丢弃。
  • RetentionPolicy.CLASS:默认值,保留在class文件中,但在运行时不可见。
  • RetentionPolicy.RUNTIME:保留在运行时,可以通过反射获取。
  • @Target:指定注解可以应用的目标元素。可选值包括:
  • ElementType.TYPE:类、接口或枚举。
  • ElementType.FIELD:字段或属性。
  • ElementType.METHOD:方法。
  • ElementType.PARAMETER:方法参数。
  • ElementType.CONSTRUCTOR:构造函数。
  • ElementType.LOCAL_VARIABLE:局部变量。
  • ElementType.ANNOTATION_TYPE:注解类型。
  • ElementType.PACKAGE:包声明。
  • @Documented:表示该注解应该被包含在生成的文档中。
  • @Inherited:表示子类可以继承父类的注解。

5. 使用示例

\\\`java // 定义一个自定义注解 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyCustomAnnotation { String value(); }

// 使用自定义注解 public class MyClass {

@MyCustomAnnotation("Hello, World!") public void myMethod() { System.out.println("This is a method with custom annotation."); }

  • args) throws Exception {

MyClass obj = new MyClass(); Method method = obj.getClass().getMethod("myMethod"); if (method.isAnnotationPresent(MyCustomAnnotation.class)) { MyCustomAnnotation annotation = method.getAnnotation(MyCustomAnnotation.class); System.out.println("Annotation value: " + annotation.value()); } } } \\\`

面试题

1. 注解的作用是什么?

答:注解主要用于提供元数据,即关于程序元素(如类、方法、字段等)的额外信息。它们可以帮助开发者编写更简洁、更具表达力的代码,并且可以在编译期或运行时通过工具或框架进行处理。

2. 什么是元注解?有哪些常用的元注解?

答:元注解是用来标注其他注解的注解。常用的元注解包括:

  • @Retention:指定注解的生命周期。
  • @Target:指定注解可以应用的目标元素。
  • @Documented:表示该注解应该被包含在生成的文档中。
  • @Inherited:表示子类可以继承父类的注解。

3. @Override和 @Deprecated的作用分别是什么?

答:

  • @Override 用于标记一个方法是重写父类的方法。如果该方法并未重写任何父类方法,则编译时会报错。
  • @Deprecated 用于标记一个类、方法或字段已经过时,不推荐使用。编译器会发出警告。

4. 如何创建自定义注解?

答:通过 @interface 关键字定义自定义注解。例如:

java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyCustomAnnotation { String value(); }

5. @Retention的不同策略有什么区别?

答:

  • RetentionPolicy.SOURCE:仅保留在源文件中,编译后丢弃。
  • RetentionPolicy.CLASS:默认值,保留在class文件中,但在运行时不可见。
  • RetentionPolicy.RUNTIME:保留在运行时,可以通过反射获取。

6. 如何在运行时读取注解?

答:可以通过反射机制读取注解。例如:

java Method method = obj.getClass().getMethod("myMethod"); if (method.isAnnotationPresent(MyCustomAnnotation.class)) { MyCustomAnnotation annotation = method.getAnnotation(MyCustomAnnotation.class); System.out.println("Annotation value: " + annotation.value()); }

7. @FunctionalInterface的作用是什么?

答:@FunctionalInterface 用于标记一个接口是函数式接口(只有一个抽象方法的接口)。这有助于编译器检查接口是否符合函数式接口的要求,并允许使用Lambda表达式简化代码。

8. 为什么需要 @SuppressWarnings注解?

答:@SuppressWarnings 用于抑制编译器警告信息,可以指定要忽略的警告类型。这有助于减少不必要的警告信息,使代码更加整洁。

9. @SafeVarargs是做什么用的?

答:@SafeVarargs 用于标记泛型方法或构造函数的安全性,避免在使用变长参数时产生警告。它可以确保变长参数的使用是安全的,不会引发潜在的类型安全问题。

10. 你如何理解 @Deprecated注解?它对性能有影响吗?

答:@Deprecated 注解用于标记一个类、方法或字段已经过时,不推荐使用。编译器会发出警告。它不会对性能产生直接影响,但它提醒开发者不要使用过时的API,以避免未来可能出现的问题。

总结

Java中的注解是一个强大的工具,能够显著提高代码的可读性和可维护性。通过合理使用注解,可以简化代码逻辑,增强开发效率。希望以上内容对你有所帮助!

相关文章

Java变量、常量、运算符、数组_java常量与变量例子

变量(Variables)在 Java 中,变量用于存储程序运行时所需的数据(The data required during the runtime)。变量的声明(The declaration o...

Java变量_java变量名命名规则

变量如果按照大部分的书上来说,在程序运行过程中可以改变的量称之为变量。常量就是程序运行中不可改变的量就是常量。变量准确的来说就是存储的名称,如果你要把数据存到内存里,你就需要选择一个数据类型,而且还要...

Java SE 基础教程—JDK的下载安装及环境变量的配置(win10详细版)

1.什么是JDKSun公司提供了一套Java开发环境,简称JDK(Java Development Kit) 它是整个Java的核心,其中包括Java编译器、Java运行工具、Java文档生成工具、J...

初识Java—(二十四)Java类成员_java 类

static关键字修饰的成员就是类成员,其中有类变量Field、类方法、静态初始化块。static修饰的类成员属于整个类,不属于单个实例。6.3.1 理解类成员在Java类里只能包含Field、方法、...

4.Java变量_java 变量

变量(Variables )每个程序都使用值。变量允许您通过将值分配给一个名称来存储值。该名称可用于在程序的后面引用该值。例如,在游戏开发中,您可以使用一个变量来存储玩家得分的点数。每个变量都有一个类...

Java代码保护方法之一:ProGuard_java如何保护源码

ProGuard是一个开源的Java程序代码压缩、优化和混淆工具,是目前Java代码保护最常用的工具。“瘦身高手”+“优化小能手”+“混乱大师”。1、压缩(瘦身高手):检查并删除没有被使用的类、字段、...