一.注解术语
http://zy19982004.iteye.com/blog/1979039里把注解里的术语罗列了一遍,未做深入解读。本文用一个例子来强化注解术语。
二.代码
package com.jyz.study.jdk.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 1.演示四种元注解的用法 * @Target * @Retention * @Document * @Inherited * * @author JoyoungZhang@gmail.com * */ @JyzTargetType @JyzRetentionRuntime @JyzDocument @JyzInherited public class MetaAnnotation { @JyzTargetField private String info; @JyzTargetConstructor public MetaAnnotation(@JyzTargetParamter String info) { this.info = info; } @JyzTargetMethod public void test(){ @JyzTargetLocalVariable String infoInner = "sa"; } } @Target(ElementType.TYPE) @interface JyzTargetType{} //接口、类、枚举、注解 @Target(ElementType.FIELD) @interface JyzTargetField{} //字段、枚举的常量 @Target(ElementType.METHOD) @interface JyzTargetMethod{} //方法 @Target(ElementType.PARAMETER) @interface JyzTargetParamter{} //方法参数 @Target(ElementType.CONSTRUCTOR) @interface JyzTargetConstructor{} //构造函数 @Target(ElementType.LOCAL_VARIABLE) @interface JyzTargetLocalVariable{} //局部变量 @Target(ElementType.ANNOTATION_TYPE) @interface JyzTargetAnnotationType{} //注解 @Target(ElementType.PACKAGE) @Retention(RetentionPolicy.RUNTIME) @interface JyzTargetPackage{public String version() default "";} //包 @JyzTargetAnnotationType @interface JyzTargetAll{} @Retention(RetentionPolicy.SOURCE) @interface JyzRetentionSource{} @Retention(RetentionPolicy.CLASS) @interface JyzRetentionClass{} @Retention(RetentionPolicy.RUNTIME) @interface JyzRetentionRuntime{} @Documented @interface JyzDocument{} @Inherited @interface JyzInherited{}
三.代码解释
- Java内置了四种元注解。或许你要问了,这四种元注解又是哪里来的呢?我们来看看这三种元注解,得到的答案是每一种元注解又是建立在四个元注解的基础之上的。有点自己定义自己的意思。
package java.lang.annotation; @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Target { ElementType[] value(); } @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Retention { RetentionPolicy value(); } @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Documented { } @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Inherited { }
- 什么时候使用这四个元注解?仅仅在你需要定义自己的注解类时,如代码里的Jyz*这些类都是自定义的注解类。
- 什么时候使用自定义注解类或Java内置的几个标准注解类?当然是在普通Java类(指的是不是注解类的类如MetaAnnotation,有时候我也叫它被注解类)里使用。需要记住的是,普通Java类里并不能直接使用元注解,如果你在MetaAnnotation上面加上@Documented,肯定编译报错。
- @Target的八种参数,前六种很好理解,该用什么地方就用什么地方。PACKAGE包的声明会在下文http://zy19982004.iteye.com/blog/1979308单独讲解。于是就是剩下一个ANNOTATION_TYPE了,这个代表了自定义的注解只能用在注解上,看看四个元注解便知,看看
@JyzTargetAnnotationType @interface JyzTargetAll{}
也是这个意思。在自定义的注解类里@Target未指定任何参数的话,代表八种都包括,在代码合适的地方我都能使用@JyzTargetAll。 - @Inherited的作用也在下文说http://zy19982004.iteye.com/blog/1979520。
- @Documented:如果Java普通类里使用@JyzDocumented,则普通Java类的Javadoc里保留@JyzDocumented。
四.使用总结
- 使用四种元注解定义自己的注解类
- @Target(ElementType.?)就根据需要定义吧,不太同意定义成@JyzTargetAll。
- 除非你能保证你的注解类永远被使用在不需要反射的类上,但这个似乎不太可能,所以你最好@Retention(RetentionPolicy.RUNTIME)。
- 至于@Documented也加上吧,对jvm来说完全没什么负担。
- 也建议加上@Inherited,尽管你觉得现在是不需要的,指不定两个被注解类就存在继承关系。
- 为注解类定义需要的属性(上面的Jyz*这些注解类主要是为了演示元注解的使用,并未加上任何元素),并设置默认值。
- 普通Java类里合适的地方使用合适的注解类,并为需要赋值的元素赋值,不赋值将使用默认值。为元素赋值的方式为名-值对,如@JyzTargetPackage(version="1.0") 。如果恰好只需要为一个元素赋值,而这个元素定义为value(),无需使用名值对,只需在括号内给出value元素所需的值即可,如@JyzTargetPackage("1.0") 。
相关推荐
地级市GDP及产业结构数据-最新.zip
2006-2023年上市公司资产误定价Misp数据集(4.9万样本,含原始数据、代码及结果,最新).zip
本文对两大主流FPGA厂商的从串配置模式(Altera:Passive Serial Mode;Xilinx:Slave Serial Mode)进行了描述,并指出了主要的不同之处。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
R语言高级建模课程全集-最新整理.zip
内容概要:本文档展示了使用 Python绘制一个三维爱心的具体方法与步骤。 适用人群:适合对Python编程语言有一定了解,并且希望学习如何完成复杂图像渲染的研究者或开发者。 使用场景及目标:本项目适用于教学环境或是个人兴趣爱好,能够帮助读者更好地掌握三维图形编程技巧以及了解隐函数作图的基本原理。
该文档为核心配置实验思路,在实验中有不懂的请参考该思路
四大政策效应评价方法全集-最新.zip
该实验为核心配置实验,与下一个采用其不同的方法进行配置,其核心思路一样,顺序略有差异,请大家进行对比反复琢磨
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
单基因生物信息学分析视频教程-完整版最新.zip
在现代工业自动化和电动汽车领域,永磁同步电机(PMSM)因其高效率、高性能和紧凑设计而备受青睐。本文将详细介绍如何在Simulink中实现PMSM的控制,包括矢量控制(FOC)策略的实现,以及必要的代码示例,旨在为工程师和研究者提供实用的指导。 一、PMSM控制概述 永磁同步电机(PMSM)以其高功率密度、高效率和优异的动态响应而广泛应用于工业和汽车领域。在Simulink中实现PMSM控制,通常采用矢量控制(Field-Oriented Control, FOC)策略,该策略通过磁场定向控制实现电机转矩和速度的精确控制。 二、PMSM数学模型与Simulink实现 PMSM的数学模型包括电压方程、磁链方程和转矩方程。在Simulink中,我们可以通过构建相应的模块来实现这些方程。 1. PMSM数学模型 电压方程: u d = R s i d − ω e L q i q + L d d i d d t + ω e ψ f u d =Rsid−ω e L q iq+
2000-2020年中国海洋统计年鉴-最新数据发布.zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
安慰剂检验代码与数据文章-最新研究成果.zip
VB+ACCESS学生公寓管理系统(源代码+系统)
职业规划(1).zip
网络办公系统 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B
地级市进出口贸易及外资利用数据(297城)-最新.zip
Jupyter-Notebook