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

相关文章
|
5月前
|
XML Java 数据格式
SpringBoot Profiles特性
SpringBoot Profiles特性
|
6月前
|
IDE Java Maven
Springboot中Processor注解概念以及实战案例
【5月更文挑战第28天】在Spring Boot中,没有直接名为Processor的注解。不过,你可能是在谈论与Spring Boot相关的注解处理器(Annotation Processors)的概念,尤其是在处理自定义注解或@ConfigurationProperties注解时的情况。
364 1
|
6月前
|
Java 数据库连接 数据处理
springboot @Target(ElementType.FIELD)的概念与使用
【4月更文挑战第25天】在Java注解中,@Target注解用于指定另一个注解可以应用的Java元素类型。使用ElementType.FIELD作为@Target的参数时,这表明标注的注解仅可用于类的字段上。
295 1
|
Java Spring 容器
|
开发框架 Java 调度
[java]spring-Quartz定时任务
[java]spring-Quartz定时任务
157 0
|
存储 Oracle Java
SpringBoot - 探究Spring Boot应用是如何通过java -jar 启动的
SpringBoot - 探究Spring Boot应用是如何通过java -jar 启动的
368 0
|
Java 测试技术 索引
Spring杂谈 | 你真的了解泛型吗?从java的Type到Spring的ResolvableType(2)
Spring杂谈 | 你真的了解泛型吗?从java的Type到Spring的ResolvableType(2)
350 0
Spring杂谈 | 你真的了解泛型吗?从java的Type到Spring的ResolvableType(2)
|
Java uml Spring
Spring杂谈 | 你真的了解泛型吗?从java的Type到Spring的ResolvableType(1)
Spring杂谈 | 你真的了解泛型吗?从java的Type到Spring的ResolvableType(1)
266 0
Spring杂谈 | 你真的了解泛型吗?从java的Type到Spring的ResolvableType(1)
|
Java Spring
Java--SpringBoot-26-定时器-Spring Task
今天看一下Spring的定时器-Spring Task。依赖Spring的jar包即可。
159 0
Java--SpringBoot-26-定时器-Spring Task
|
缓存 监控 Java
Java--SpringBoot-18-执行器Actuator
今天看一下SpringBoot的执行器-actuator
597 0
Java--SpringBoot-18-执行器Actuator