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

相关文章
|
Java 容器 Spring
springboot中的@Configuration详解~
springboot中的@Configuration详解~
447 0
|
SQL 存储 关系型数据库
解析MySQL Binlog:从零开始的入门指南【binlog入门指南】
解析MySQL Binlog:从零开始的入门指南【binlog入门指南】
13998 0
|
算法 安全 Java
Java性能优化(四)-多线程调优-Synchronized优化
JVM在JDK1.6中引入了分级锁机制来优化Synchronized,当一个线程获取锁时,首先对象锁将成为一个偏向锁,这样做是为了优化同一线程重复获取导致的用户态与内核态的切换问题;其次如果有多个线程竞争锁资源,锁将会升级为轻量级锁,它适用于在短时间内持有锁,且分锁有交替切换的场景;轻量级锁还使用了自旋锁来避免线程用户态与内核态的频繁切换,大大地提高了系统性能;但如果锁竞争太激烈了,那么同步锁将会升级为重量级锁。减少锁竞争,是优化Synchronized同步锁的关键。
444 2
|
存储 Java Maven
使用Java实现OAuth 2.0认证授权
使用Java实现OAuth 2.0认证授权
1785 0
|
缓存 监控 安全
Spring AOP 详细深入讲解+代码示例
Spring AOP(Aspect-Oriented Programming)是Spring框架提供的一种面向切面编程的技术。它通过将横切关注点(例如日志记录、事务管理、安全性检查等)从主业务逻辑代码中分离出来,以模块化的方式实现对这些关注点的管理和重用。 在Spring AOP中,切面(Aspect)是一个模块化的关注点,它可以跨越多个对象,例如日志记录、事务管理等。切面通过定义切点(Pointcut)和增强(Advice)来介入目标对象的方法执行过程。 切点是一个表达式,用于匹配目标对象的一组方法,在这些方法执行时切面会被触发。增强则定义了切面在目标对象方法执行前、执行后或抛出异常时所
17546 4
|
Java 开发者 微服务
深入解析@SpringBootApplication注解:简化Spring Boot应用的配置
在现代的Java开发中,Spring Boot框架成为了构建微服务和快速开发应用的首选。Spring Boot的成功部分归功于其简化的配置和约定大于配置的理念。而`@SpringBootApplication`注解则是Spring Boot应用的入口,负责自动配置和启动Spring Boot应用。本文将深入探讨`@SpringBootApplication`注解的作用、用法,以及在Spring Boot应用中的应用场景。
1896 1
|
Java Spring
【亲测有效完结bug】org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exce
【亲测有效完结bug】org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exce
1852 0
|
Java 数据库连接 数据处理
springboot @Target(ElementType.FIELD)的概念与使用
【4月更文挑战第25天】在Java注解中,@Target注解用于指定另一个注解可以应用的Java元素类型。使用ElementType.FIELD作为@Target的参数时,这表明标注的注解仅可用于类的字段上。
547 1
|
Java Spring
springboot @Inherited的概念与使用
【4月更文挑战第25天】在Spring Boot中,@Inherited是Java提供的一个注解,用于指示某个注解类型可以从超类继承到子类。当一个使用了@Inherited标记的注解被用在一个类上时,这个注解会被其所有的子类继承,除非子类自己也通过相同的注解进行了声明。
593 0
|
Java 开发者 Spring
springboot @Primary的概念与使用
【4月更文挑战第26天】在 Spring Framework 中,@Primary 注解用于标记一个 bean 作为在多个同类型的 bean 候选中进行自动装配时的首选 bean。这个注解非常有用,在配置和自动装配复杂的 Spring 应用程序时尤其如此,特别是当有多个 bean 实现相同的接口或继承相同的类时
1389 3