【JavaSe】高级特性篇(三) Java高级特性注解

2023-11-17

JavaSe·高级特性篇(三) Java高级特性注解


1. 注解(Annotation)概述

1.1 定义

定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

1.2 与注释的区别

注解:说明程序的。给计算机看的
注释:用文字描述程序的。给程序员看的

2. 作用分类

①编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
②代码分析:通过代码里标识的注解对代码进行分析【使用反射】
③编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】

3. JDK中预定义的一些注解

  • @Override :检测被该注解标注的方法是否是继承自父类(接口)的
  • @Deprecated:该注解标注的内容,表示已过时
  • @SuppressWarnings:压制警告
    • 一般传递参数all @SuppressWarnings(“all”)

4. 自定义注解

4.1 格式

元注解

public @interface 注解名称{
	属性列表;
}

4.2 本质

注解本质上就是一个接口,该接口默认继承Annotation接口

public interface MyAnno extends java.lang.annotation.Annotation {}

4.3 属性

要求:

  1. 属性的返回值类型有下列取值
    * 基本数据类型
    * String
    * 枚举
    * 注解
    * 以上类型的数组

  2. 定义了属性,在使用时需要给属性赋值
    * 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
    * 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
    * 数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略

@MyAnnotation(value="哈哈哈")
public class MyAnnotationTest {
	public static void main(String[] args) {
	Class clazz = MyAnnotationTest.class;
	Annotation a = clazz.getAnnotation(MyAnnotation.class);
	MyAnnotation m = (MyAnnotation) a;
	String info = m.value();
	System.out.println(info);
	}
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface MyAnnotation{
	String value() default "hehehe";
}

5. 元注解

JDK 的元 Annotation 用于修饰其他 Annotation 定义

JDK5.0提供了4个标准的meta-annotation类型,分别是:

  • Retention
  • Target
  • Documented
  • Inherited

5.1 @Retention

只能用于修饰一个 Annotation 定义, 用于指定该 Annotation 的生命周期

@Rentention 包含一个 RetentionPolicy 类型的成员变量,使用@Rentention 时必须为该 value 成员变量指定值:

  • RetentionPolicy.SOURCE:在源文件中有效(即源文件保留),编译器直接丢弃这种策略的注释
  • RetentionPolicy.CLASS:在class文件中有效(即class保留) , 当运行 Java 程序时, JVM不会保留注解。 这是默认值
  • RetentionPolicy.RUNTIME:在运行时有效(即运行时保留),当运行 Java 程序时, JVM 会保留注释。程序可以通过反射获取该注释。
public enum RetentionPolicy{
	SOURCE,
	CLASS,
	RUNTIME
}

在这里插入图片描述

5.2 @Target

用于修饰 Annotation 定义, 用于指定被修饰的 Annotation 能用于修饰哪些程序元素
在这里插入图片描述

5.3 @Documented

用于指定被该元 Annotation 修饰的 Annotation 类将被javadoc 工具提取成文档。默认情况下,javadoc是不包括注解的。

定义为Documented的注解必须设置Retention值为RUNTIME。

5.4 @Inherited

被它修饰的 Annotation 将具有继承性。如果某个类使用了被@Inherited 修饰的 Annotation, 则其子类将自动具有该注解。

比如:如果把标有@Inherited注解的自定义的注解标注在类级别上,子类则可以继承父类类级别的注解。实际应用中,使用较少

6. 利用反射获取注解信息

  • JDK 5.0 在 java.lang.reflect 包下新增了 AnnotatedElement 接口, 该接口代表程序中可以接受注解的程序元素
  • 当一个 Annotation 类型被定义为运行时 Annotation 后, 该注解才是运行时可见, 当 class 文件被载入时保存在 class 文件中的 Annotation 才会被虚拟机读取
  • 程序可以调用 AnnotatedElement对象的如下方法来访问 Annotation 信息
    在这里插入图片描述

7. JDK8中注解的新特性

Java 8对注解处理提供了两点改进

  • 可重复的注解
  • 可用于类型的注解

此外,反射也得到了加强,在Java8中能够得到方法参数的名称。这会简化标注在方法参数上的注解。

7.1 可重复注解

@Repeatable(MyAnnotations.class)
@Target({TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotations {
	String value();
}
@MyAnnotations("hello")
@MyAnnotations("world")
public void show(){
}

7.2 类型注解

JDK1.8之后,关于元注解@Target的参数类型ElementType枚举值多了两个:TYPE_PARAMETER,TYPE_USE

  • ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中(如:泛型声明)
public class TestTypeDefine<@TypeDefine() U> {
	private U u;
	public <@TypeDefine() T> void test(T t){
	}
}
@Target({ElementType.TYPE_PARAMETER})
@interface TypeDefine{
}
  • ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中。
@MyAnnotation
public class AnnotationTest<U> {
	@MyAnnotation
	private String name;
	public static void main(String[] args) {
		AnnotationTest<@MyAnnotation String> t = null;
		int a = (@MyAnnotation int) 2L;
		@MyAnnotation
		int b = 10;
	}
	public static <@MyAnnotation T> void method(T t) {
	}
	public static void test(@MyAnnotation String arg) throws @MyAnnotation Exception {
	}
}
@Target(ElementType.TYPE_USE)
@interface MyAnnotation {
}

8. 模拟测试框架

  1. 写个MyTest.java注解
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest{ 
	String name() default "lzcc";
}
  1. Step2:写个测试类TestDemo.java
class TestDemo{
	@MyTest
	public void test1(){
		System.out.println("test1 方法执行了!");
	}
	@MyTest(name = "詹姆斯")
	public void test2(){
		System.out.println("test2 方法执行了!");
	}
}

Step3:写个TestRunner

//1.获取字节码文件
Class clazz = TestDemo.class
//2.获取该类的方法
Method[] methods = clz.getMethods();
for(Method m : methods){
	//3.获取方法上的注解
	MyTest myTest = m.getAnnotation(MyTest.class);
	if(null != MyTest){
		System.out.println("方法名:" + m.getName());
		System.out.println("注解的name属性:" + myTest.name());
		//4.执行测试放啊
		m.invoke(clz.newInstance());
		System.out.println("--------------------------------");
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【JavaSe】高级特性篇(三) Java高级特性注解 的相关文章

  • 如何在由子控件组成的 SWT 复合材料上跟踪鼠标?

    我创建了自己的控件 我想跟踪鼠标并添加一个MouseTrackListener 很遗憾MouseEnter and MouseLeave当鼠标移动到我的合成部分 即标签和按钮 上时 也会生成事件 Mouse enter mouse ente
  • TreeMap 删除所有大于某个键的键

    在项目中 我需要删除键值大于某个键的所有对象 键类型为Date 如果重要的话 据我所知TreeMapJava中实现的是红黑树 它是一种二叉搜索树 所以我应该得到O n 删除子树时 但除了制作尾部视图并一一删除之外 我找不到任何方法可以做到这
  • java.lang.ClassNotFoundException:javax.mail.MessagingException

    我想使用 eclipse 将电子邮件从我的 gmail 帐户发送到另一个邮件帐户 我使用 apache tomcat 7 0 34 作为我的 Web 服务器 并使用端口 8080 作为 apache 服务器 HTTP 1 1 并使用 JRE
  • 两个整数乘积的模

    我必须找到c c a b mod m a b c m 是 32 位整数 但 a b 可以超过 32 位 我正在尝试找出一种计算 c 的方法 而不使用 long 或任何 gt 32 位的数据类型 有任何想法吗 如果m是质数 事情可以简化吗 注
  • 垃圾收集器如何在幕后工作来收集死对象?

    我正在阅读有关垃圾收集的内容 众所周知 垃圾收集会收集死亡对象并回收内存 我的问题是 Collector 如何知道任何对象已死亡 它使用什么数据结构来跟踪活动对象 我正在研究这个问题 我发现GC实际上会跟踪活动对象 并标记它们 每个未标记的
  • Java 的支持向量机?

    我想用Java编写一个 智能监视器 它可以随时发出警报detects即将到来的性能问题 我的 Java 应用程序正在以结构化格式将数据写入日志文件
  • 如何在 Java 中向时间戳添加/减去时区偏移量?

    我正在使用 JDK 8 并且玩过ZonedDateTime and Timestamp很多 但我仍然无法解决我面临的问题 假设我得到了格式化的Timestamp在格林威治标准时间 UTC 我的服务器位于某处 假设它设置为Asia Calcu
  • 将巨大的模式编译成Java

    有两个主要工具提供了将 XSD 模式编译为 Java 的方法 xmlbeans 和 JAXB 问题是 XSD 模式确实很大 30MB 的 XML 文件 大部分模式在我的项目中没有使用 所以我可以注释掉大部分代码 但这不是一个好的解决方案 目
  • java inputstream 打印控制台内容

    sock new Socket www google com 80 out new BufferedOutputStream sock getOutputStream in new BufferedInputStream sock getI
  • Sun 在 EDT 之外做 GUI 工作的演示?

    我正在看SplashDemo java http download oracle com javase tutorial uiswing examples misc SplashDemoProject src misc SplashDemo
  • 如何在字段值无效的情况下更改 Struts2 验证错误消息?

    我在 Web 表单上使用 Struts2 验证 如果字段假设为整数或日期 则
  • 如何使用 JMagick 转换色彩空间?

    如何使用 JMagick API 转换色彩空间 例如 CMYK gt RGB 和 RGB gt CMYK None
  • 在Java中运行bat文件并等待

    您可能会认为从 Java 启动 bat 文件是一项简单的任务 但事实并非如此 我有一个 bat 文件 它对从文本文件读取的值循环执行一些 sql 命令 它或多或少是这样的 FOR F x in CD listOfThings txt do
  • 不可变的最终变量应该始终是静态的吗? [复制]

    这个问题在这里已经有答案了 在java中 如果一个变量是不可变的并且是final的 那么它应该是一个静态类变量吗 我问这个问题是因为每次类的实例使用它时创建一个新对象似乎很浪费 因为无论如何它总是相同的 Example 每次调用方法时都会创
  • 如何区分从 Saxon XPathSelector 返回的属性节点和元素节点

    给定 XML
  • 列表过滤器内的 Java 8 lambda 列表

    示例 JSON id 1 products id 333 status Active id 222 status Inactive id 111 status Active id 2 products id 6 status Active
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应
  • partitioningBy 必须生成一个包含 true 和 false 条目的映射吗?

    The 分区依据 https docs oracle com javase 8 docs api java util stream Collectors html partitioningBy java util function Pred
  • Spring RESTful控制器方法改进建议

    我是 Spring REST 和 Hibernate 的新手 也就是说 我尝试组合一个企业级控制器方法 我计划将其用作未来开发的模式 您认为可以通过哪些方法来改进 我确信有很多 RequestMapping value user metho
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • UML类图几种关系的总结

    在UML类图中 常见的有以下几种关系 泛化 Generalization 实现 Realization 关联 Association 聚合 Aggregation 组合 Composition 依赖 Dependency 1 泛化 Gene
  • 子类加@Data后,IDEA调试时“出现”父类属性无值

    项目场景 自测一个功能的时候 IDEA调试同过对象的VIEW查看对象内容 发现加了 Data的返回子类型中父类的属性没有出现 问题描述 父类Response中的返回VO对象 Data public class PVO private Sti
  • 链式存储之:链表的引出及其简介

    上篇博客 笔者讲解了一下顺序表ArrayList 对于ArrayList有想法的各位老铁可以看一下 值得思索的 ArrayList和线性表 你确定错过这次机会 念君思宁的博客 CSDN博客值得思索的 ArrayList和线性表 你确定错过这
  • python格式化

    python格式化是python语法中很基础也是很重要的知识 本文介绍了python格式化的几种方法仅供参考 一 格式化方法1 格式为 输出内容 对应的变量1 对应的变量2 其中 d表示整数类型 s表示字符串类型 f表示浮点类型 例子 设以
  • 半实物仿真测试方法、装置及系统与流程

    机器人控制器的测试主要包括控制器核心软件的测试和外部接口的测试 同时为了保证机器人控制器在真实工况下进行测试 需要对其实际运行的各项功能和性能指标进行测试 半实物仿真测试平台是连接控制器和被控对象进行测试的测试平台 在基于半实物仿真的实验中
  • 数据清洗:让数据更纯净,Python实战 机器学习&深度学习

    目录 步骤1 导入必要的库 步骤2 加载数据 步骤3 处理缺失值 3 1 删除含有缺失值的行
  • 给应届生开出20K月薪,看到招聘要求后,我傻眼了......

    一到秋招季 就有 灵异 事件发生 应届生痛斥找不到工作 精心准备的简历投了几十家过不了网申 而企业控诉招不到人才 今年明明扩招了 应届生be like 这些岗位都挺适合我的 简直一个量身打造 用人单位be like 岗位要求门槛写得也不高
  • MySQL数据库迁移快速导出导入大量数据(外发)

    数据库迁移是我们经常可遇到的问题 对于少量的数据 迁移基本上不会有什么问题 生产环境中 有以下情况需要做迁移工作 磁盘空间不够 比如一些老项目 选用的机型并不一定适用于数据库 随着时间的推移 硬盘很有可能出现短缺 业务出现瓶颈 比如项目中采
  • vue-cli3打包项目

    vue cli3打包项目 使用vue cli3开发好项目后 就可以将它打包 这样就可以通过输出文件中的index html来访问该项目了 在打包项目之前需要先修改两个文件 分别是vue config js router index js 如
  • 【C++】【TensorRT】检测时间不稳定原因汇总(持续更新)

    本人使用C 版本的TensorRT框架做模型部署的开发工作 在实际上线具体的项目过程中碰到过检测时间不理想的情况 所以本人专门为此写一篇博客记录曾经遇到过的坑以及对应的解决方案 一 相同型号的机器和显卡检测时间不同 1 问题描述 两台相同型
  • 一文掌握JS 事件循环(Event Loop)

    作为前端开发者 事件循环 Event Loop 是必须掌握的内容 它是前端极其重要的基础知识 在日常的工作或者面试中也是一个非常高频的话题 理解 JavaScript 的事件循环往往伴随着宏任务和微任务 JavaScript 单线程执行过程
  • 模电基础(2)半导体二极管

    1 二极管的组成 二极管 将PN结封装起来 引出两个电极就构成了半导体二极管 二极管的常见结构包括 点接触型 图a 面接触型 图b 平面型 图c 点接触型 结面积小 不可通过较大的电流 结电容小 工作频率高 面接触型的结面积变大 所允许的电
  • Go语言网络编程(socket编程)http编程

    1 http编程 1 1 1 web工作流程 Web服务器的工作原理可以简单地归纳为 客户机通过TCP IP协议建立到服务器的TCP连接 客户端向服务器发送HTTP协议请求包 请求服务器里的资源文档 服务器向客户机发送HTTP协议应答包 如
  • 基于滑模控制的永磁同步电机直接转矩控制学习

    导读 针对传统的DTC存在的问题进行 本期主要介绍基于滑模控制的永磁同步电机直接转矩控制 如果需要文中的仿真模型 关注微信公众号 浅谈电机控制 获取 传统DTC采用两个 Bang bang 控制器分别对转矩和磁链幅值进行控制 响应快速 对系
  • IDEA中的方法、数组和重载

    IDEA软件 常用快捷键 快捷键 功能 Ctrl Shift 选中代码注释 多行注释 再按取消注释 Ctrl Alt L 格式化代码 Alt Ins 自动生成代码 toString get set等方法 Alt Enter 导入包 自动修正
  • BSC链节点搭建 保姆级详细教程

    BSC链节点搭建 保姆级详细教程 文档最后修改日期 2023 06 24 一 服务器配置要求 官方建议配置 系统 Mac Linux CPU 16核 内存 64 GB 内存 带宽 50M以上 硬盘 大于2T固态SSD可用空间数据盘 本次搭建
  • CCPC2016长春J (hdu 5920 Ugly Problem)

    给一个数字 n 1 lt n lt 1e18 让你找一些数字加起来和为 n 数字个数不超过50个而且数字都是回文数字 每次找到大小最接近这个数的回文数即可 如6745888可以找到6745476 6960242可以找到6950595 用大数
  • 全链路压测

    核心流程 全链路压测实施的核心流程如下 骤一 确定压测目标 压测目标主要包括压测范围 策略 目的 往往与业务 技术目标息息相关 例如 压测范围 用户注册加登录 为大规模拉新做准备 压测策略 高仿真生产环境压测 提前经历真实的业务高峰 压测目
  • Vue Baidu Map组件封装:多边形组件和右键菜单

    在Vue上进行开发 地图使用了百度提供的Vue Baidu Map 当前版本为v0 21 15 官方文档地址 https dafrok github io vue baidu map zh index 开发需求 在百度地图上动态进行多边形的
  • 【JavaSe】高级特性篇(三) Java高级特性注解

    JavaSe 高级特性篇 三 Java高级特性注解 1 注解 Annotation 概述 1 1 定义 定义 注解 Annotation 也叫元数据 一种代码级别的说明 它是JDK1 5及以后版本引入的一个特性 与类 接口 枚举是在同一个层