springboot @Retention(RetentionPolicy.RUNTIME)的概念与使用

简介: 【4月更文挑战第25天】在 Java 注解中,@Retention 注解指定了注解的保留策略,即这个注解在什么阶段还有效。RetentionPolicy.RUNTIME 是这三种策略之一,表示注解不仅被保存到类文件中,还在运行时通过反射可见,这是其它两种策略(SOURCE 和 CLASS)所不具备的

在 Java 注解中,@Retention 注解指定了注解的保留策略,即这个注解在什么阶段还有效。RetentionPolicy.RUNTIME 是这三种策略之一,表示注解不仅被保存到类文件中,还在运行时通过反射可见,这是其它两种策略(SOURCECLASS)所不具备的。

概念

@Retention 注解有三种保留策略:

  • SOURCE:注解只在源码中存在,编译成 .class 文件时,注解被丢弃。
  • CLASS:注解被保留至编译后的类文件中,但 JVM 加载类文件时,注解不会被加载到内存中。
  • RUNTIME:注解不仅被保留在类文件中,当运行 Java 程序时,VM 也会把注解保留在内存中。这使得我们可以通过反射机制读取类、方法或字段上的注解信息。

使用场景

RetentionPolicy.RUNTIME 通常用于那些需要在运行时通过反射读取的注解。这在许多框架中非常常见,例如 Spring 和 Hibernate,它们依赖于运行时处理注解来进行配置和操作。例如,Spring 的事务管理、权限控制等功能就依赖于运行时解析注解。

示例

假设我们定义一个用于运行时处理的自定义注解 @MyAnnotation

java复制代码

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD) // 此注解只能用于方法
public @interface MyAnnotation {
    String description() default "No description";
}

然后在一个类中使用这个注解:

java复制代码

public class MyClass {
    @MyAnnotation(description = "This is a method to test annotations.")
    public void myMethod() {
    }
}

现在,我们可以在运行时通过反射获取这个方法上的注解信息:

java复制代码

import java.lang.reflect.Method;

public class TestAnnotation {
    public static void main(String[] args) throws Exception {
        Method method = MyClass.class.getMethod("myMethod");
        MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
        if (annotation != null) {
            System.out.println("Description: " + annotation.description());
        }
    }
}

这个示例展示了如何在运行时获取并利用注解信息,这在 Java 中是一个强大的功能,使得开发者可以写出更灵活和动态的代码。

小提示

使用 RetentionPolicy.RUNTIME 时,需要注意性能影响。因为在运行时解析注解会增加运行时的处理负担,尤其是在大型应用中。因此,应当适度使用,并在不需要运行时读取注解的场合选择 CLASSSOURCE 策略以优化性能。

相关文章
|
8月前
|
Java 测试技术
SpringBoot整合单元测试&&关于SpringBoot单元测试找不到Mapper和Service报java.lang.NullPointerException的错误
SpringBoot整合单元测试&&关于SpringBoot单元测试找不到Mapper和Service报java.lang.NullPointerException的错误
212 0
|
4月前
|
Java Spring
springboot 集成 swagger 2.x 和 3.0 以及 Failed to start bean ‘documentationPluginsBootstrapper‘问题的解决
本文介绍了如何在Spring Boot项目中集成Swagger 2.x和3.0版本,并提供了解决Swagger在Spring Boot中启动失败问题“Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is java.lang.NullPointerEx”的方法,包括配置yml文件和Spring Boot版本的降级。
springboot 集成 swagger 2.x 和 3.0 以及 Failed to start bean ‘documentationPluginsBootstrapper‘问题的解决
|
8月前
|
Java 数据库连接 数据处理
springboot @Target(ElementType.FIELD)的概念与使用
【4月更文挑战第25天】在Java注解中,@Target注解用于指定另一个注解可以应用的Java元素类型。使用ElementType.FIELD作为@Target的参数时,这表明标注的注解仅可用于类的字段上。
337 1
|
8月前
|
安全 Java Spring
springboot @Resource、@AutoWaire的用法实战
【4月更文挑战第3天】在Spring Boot中,@Autowired和@Resource注解都用于自动注入依赖,但它们在底层工作方式和使用的场合上存在一些差异。理解这些差异有助于更有效地使用Spring框架。
255 1
|
人工智能 Java
SpringBoot实战(一):使用Lombok简化你的代码
SpringBoot实战(一):使用Lombok简化你的代码
102 0
Java:Springboot的service循环依赖问题
Java:Springboot的service循环依赖问题
184 0
|
Java
Java:SpringBoot中多环境配置和@Profile注解
Java:SpringBoot中多环境配置和@Profile注解
237 0
|
Dubbo Java 编译器
一文搞定java元注解:Target、Retention、Documented、Inherited、Repeatable(JDK1.8新增)
一文搞定java元注解:Target、Retention、Documented、Inherited、Repeatable(JDK1.8新增)
707 0
一文搞定java元注解:Target、Retention、Documented、Inherited、Repeatable(JDK1.8新增)
|
Java
Java--SpringBoot-45-全局异常处理
我们今天搞一下全局异常处理,在SpringBoot中用自定义的页面来替换掉默认的异常页面。
140 0
Java--SpringBoot-45-全局异常处理
|
Java Spring
Java--SpringBoot-26-定时器-Spring Task
今天看一下Spring的定时器-Spring Task。依赖Spring的jar包即可。
166 0
Java--SpringBoot-26-定时器-Spring Task