@Retention元注解的使用
@Retention注解标记其他的注解用于指明标记的注解保留策略:
先看Java SE 8中@Target是如何声明的:
package java.lang.annotation;
public enum RetentionPolicy {
/**
* Annotations are to be discarded by the compiler.
*/
SOURCE,
/**
* Annotations are to be recorded in the class file by the compiler
* but need not be retained by the VM at run time. This is the default
* behavior.
*/
CLASS,
/**
* Annotations are to be recorded in the class file by the compiler and
* retained by the VM at run time, so they may be read reflectively.
*
* @see java.lang.reflect.AnnotatedElement
*/
RUNTIME
}
从源代码的注释中,我们看到java.lang.annotation.RetentionPolicy此枚举类声明了三种保留策略:
java.lang.annotation.RetentionPolicy.SOURCE:表示注解会在编译时被丢弃
java.lang.annotation.RetentionPolicy.CLASS:默认策略,表示注解会在编译后的class文件中存在,但是在运行时,不会被VM保留。
java.lang.annotation.RetentionPolicy.RUNTIME:表示不仅会在编译后的class文件中存在,而且在运行时保留,因此它们主要用于反射场景,可以通过getAnnotation方法获取。
这三种保留策略的使用示例:
声明@Country注解,采用的是RUNTIME策略:
package org.springmorning.demo.javabase.annotation.meta; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* @author 春晨
* @date 2019/1/14 19:30
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10265030.html
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Country {
//国家名称
String name();
//国家语言
String[] languages();
}
声明@Region注解,采用的是CLASS策略(默认策略):
package org.springmorning.demo.javabase.annotation.meta; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* @author 春晨
* @date 2019/1/14 19:37
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10265030.html
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface Region {
//地区名称
String name();
//所属国家
String country();
}
声明@Home注解,采用的是SOURCE策略:
package org.springmorning.demo.javabase.annotation.meta; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* @author 春晨
* @date 2019/1/14 19:43
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10265030.html
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Home {
//成员
String[] members();
//地址
String address();
}
编写测试类:
package org.springmorning.demo.javabase.annotation.meta; import java.lang.annotation.Annotation; /**
* @author 春晨
* @date 2019/1/14 19:34
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10265030.html
*/
@Country(
name = "China",
languages = {"Chinese"}
)
@Region(
name = "GuangDong",
country = "China"
)
@Home(
members = {"Wolffy","Wolnie","Wilie"},
address = "Qingqing grasslands"
)
public class RetentionAnnotation { public static void main(String[] args) {
Annotation[] annotations = RetentionAnnotation.class.getAnnotations();
System.out.println("获取能保留到运行时的注解:");
for (Annotation annotation :annotations){
System.out.println(annotation.toString());
}
}
}
运行结果:
获取能保留到运行时的注解:
@org.springmorning.demo.javabase.annotation.meta.Country(name=China, languages=[Chinese])
采用javap命令分析RetentionAnnotation的class文件如下图:

下节继续
下节将给大家讲解元注解@Document的使用。
@Retention元注解的使用的更多相关文章
- java @Retention元注解
@Retention元注解 有三种取值:RetentionPolicy.SOURCE.RetentionPolicy.CLASS.RetentionPolicy.RUNTIME分别对应:Java源文件 ...
- Java元注解—— @Retention @Target @Document @Inherited
java中元注解有四个: @Retention @Target @Document @Inherited: @Retention:注解的保留位置 @Retention(RetentionPolicy. ...
- Java元注解@Retention规则
@Retention是java当中的一个元注解,该元注解通常都是用于对软件的测试 1.适用方式: @Retention(RetentionPolicy.RUNTIME) @interf ...
- Java 元注解
元注解@Target,@Retention,@Documented,@Inherited * * @Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: * Elemen ...
- Java元注解
元注解是指注解的注解,包括@Retention @Target @Document @Inherited四种. 1.@Retention: 定义注解的保留策略@Retention(RetentionP ...
- [读书笔记] 二、条件注解@Conditional,组合注解,元注解
一.条件注解@Conditional,组合注解,元注解 1. @Conditional:满足特定条件创建一个Bean,SpringBoot就是利用这个特性进行自动配置的. 例子: 首先,两个Condi ...
- 自定义注解,andjdk提供的元注解
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitN ...
- Spring Boot实战笔记(九)-- Spring高级话题(组合注解与元注解)
一.组合注解与元注解 从Spring 2开始,为了响应JDK 1.5推出的注解功能,Spring开始大量加入注解来替代xml配置.Spring的注解主要用来配置注入Bean,切面相关配置(@Trans ...
- Java开发笔记(八十二)注解的基本单元——元注解
Java的注解非但是一种标记,还是一种特殊的类型,并且拥有专门的类型定义.前面介绍的五种内置注解,都可以找到对应的类型定义代码,例如查看注解@Override的源码,发现它的代码定义是下面这样的: @ ...
- 【Java编程思想笔记】注解--元注解
参考文章:(小白的小小白的白 )https://blog.csdn.net/weixin_42315600/article/details/80630669 https://www.cnblogs.c ...
随机推荐
- 基于el-input实现数字区间输入框(已发布npm/github)
项目地址:https://github.com/heyu3913/InputNumberRange (求star) input-number-range tips:更多定制化需求请联系: 13102 ...
- crictl和ctr与docker的命令的对比
containerd 相比于docker , 多了namespace概念, 每个image和container 都会在各自的namespace下可见, 目前k8s会使用k8s.io 作为命名空间 cr ...
- ACM-DP-数塔问题
Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告 ...
- OpenTranslator:一款基于ChatGPT API的翻译神器
这是一款使用 ChatGPT API 进行划词翻译和文本润色的浏览器插件.借助了 ChatGPT 强大的翻译能力,它将帮助您更流畅地阅读外语和编辑外语. 它能干啥 一. 可翻译 二. 可润色 三. 可 ...
- Flask框架使用蓝图划分目录、g对象、使用数据库连接池链接数据库
目录 一.使用蓝图划分项目目录 1.蓝图的介绍 2.蓝图的使用 二.介绍flask框架的g对象 1. g对象是什么? 2. 使用代码再次解释g对象 三.使用数据库连接池链接数据库 1. 引入数据库连接 ...
- 统计模拟实验—R实现(蒲丰投针)
统计模拟实验 统计模拟是数理统计.和计算机科学的结合,是一门综合性学科.在科学研究和生产实际的各个领域中,普遍存在着大量数据的分析处理工作.如何应用数理统计中的方法来解决实际问题,以及如何解决在应用中 ...
- [Git/SVN] Gitee使用教程
1 Gitee Gitee 提供免费的 Git 仓库,还集成了代码质量检测.项目演示等功能. 对于团队协作开发,Gitee 还提供了项目管理.代码托管.文档管理的服务,5 人以下小团队免费. CASE ...
- [Linux/Git]比较两份文件的差异
Command vim -d fileA fileB 或 git diff <oldCommitId> <newCommitId> X Recommend Files Matc ...
- 四月十二号java基础知识
1.面向对象的编程思想是力图使在计算机语言中对事物的描述与现实世界中该事物的本来面目尽可能地一致.2.类(class)和对象(object)是面向对象程序设计方法中最核心的概念3.类是对某一事物的描述 ...
- 全网最详细中英文ChatGPT-GPT-4示例文档-智能多功能学习机从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)
目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node.js接口请求示 ...