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 策略以优化性能。

相关文章
|
7月前
|
XML JavaScript 前端开发
【Java】Spring Boot中的配置properties 和 yml 的区别
【Java】Spring Boot中的配置properties 和 yml 的区别
|
1月前
|
安全 Java Spring
springboot @Resource、@AutoWaire的用法实战
【4月更文挑战第3天】在Spring Boot中,@Autowired和@Resource注解都用于自动注入依赖,但它们在底层工作方式和使用的场合上存在一些差异。理解这些差异有助于更有效地使用Spring框架。
32 1
|
9月前
|
Java Spring
Java——spring boot打的jar包如何引用外部application.properties
Java——spring boot打的jar包如何引用外部application.properties
|
12月前
|
存储 Oracle Java
SpringBoot - 探究Spring Boot应用是如何通过java -jar 启动的
SpringBoot - 探究Spring Boot应用是如何通过java -jar 启动的
314 0
|
12月前
|
Java
Java入门005~Springboot2.2.4引入freemarker模板
Java入门005~Springboot2.2.4引入freemarker模板
182 0
|
Java
Java--SpringBoot-45-全局异常处理
我们今天搞一下全局异常处理,在SpringBoot中用自定义的页面来替换掉默认的异常页面。
96 0
Java--SpringBoot-45-全局异常处理
|
Java Spring
Java--SpringBoot-26-定时器-Spring Task
今天看一下Spring的定时器-Spring Task。依赖Spring的jar包即可。
122 0
Java--SpringBoot-26-定时器-Spring Task
|
Java 容器 Spring
【SpringBoot2 从0开始】底层注解 - @Configuration
【SpringBoot2 从0开始】底层注解 - @Configuration
【SpringBoot2 从0开始】底层注解 - @Configuration
|
Java 网络架构
Java-SpringBoot-05-使用@Value注解注入单个应用程序参数
SpringBoot中可以使用使用@Value注解注入单个应用程序参数,很方便的在业务类中使用。
166 0
Java-SpringBoot-05-使用@Value注解注入单个应用程序参数