定义
- 也叫作元数据。一种代码级别的说明。他是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以生命在包、类、字段、方法、局部变量、方法参数等的前面,用于对这些元素进行说明,注释。
作用的分类
- 编写文档:通过代码里标识的元数据生成文档
- 代码分析:通过代码里标识的元数据对代码进行分析
- 编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查
如何定义一个注解
示例如下
}
一、可以为其添加相应的参数,参数的定义为:【类型 参数名称() default 属性值】或者【类型 参数名称()】。如果没有为参数定义默认值,则使用该注解时,此参数为必填项。
@interface Style{ String background() default "blue"; //设置默认值 int fontSize() ; //没有设置默认值,则使用本注解时,该参数必填 String[] padding() default {"0"}; enum Color{ BULE,RED,GREEN}; boolean gnore() default false; } @Style(fontSize=1) class Table{ } public class ZhujieTest { public static void main(String[] args) { Method m; try { //获取方法上的注解。获取字段、类的注解的方式和获取方式的注解方式类似。 m = Table.class.getMethod("a",null); System.out.println(m); System.out.println(m.getDeclaredAnnotations().length); System.out.println(m.getAnnotations().length); System.out.println(m.getAnnotation(Style.class));//获取指定的注解 } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
注解参数可以支持的数据类型:
- 所有的基本类型(int,float,boolean,byte,double,char,long,short)
- String类型
- Class类型
- enum类型
- Annoatation类型
- 以上所有类型的数组
注:基本类型的包装类也不支持。
二、4个标准的meta-annotation类型,它们被用来提供对其他annotation类型作说明。它们分别是
- @Target 用来说明注解所修饰的对象范围
- @Retention 定义了该注解所保留的时间长短
- @Documented 用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化
- @Inherited 元注解的一个标记注解。该是否能被子类所继承。
@Target,若未使用添加该注解,则使用位置不受限制。其取值(ElementType)如下:
CONSTRUCTOR | 用于描述构造器 |
FIELD | 用于描述域 |
LOCAL_VARIABLE | 用于描述局部变量 |
METHOD | 用于描述方法 |
PACKAGE | 用于描述包 |
PARAMETER | 用于描述参数 |
TYPE | 用于描述类、接口(包括注解类型) 或enum声明 |
@Retention,被描述的注解在什么范围内失效。其取值(RetentionPoicy)如下
SOURCE | 在源文件中有效(即源文件保留) |
CLASS | 在class文件中有效(即class保留) |
RUNTIME | 在运行时有效(即运行时保留) |
其关系:RUNTIME 包含CLASS,CLASS 包含SOURCE。
注:若不添加该注解,则默认是保留在class文件内有效。只有设置为RUNTIME,才能通过反射获取到。
@Documented
用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
@Inherited
是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。
当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。
总结:若希望通过反射获取注解,请添加 @Retention(RetentionPolicy.RUNTIME);
若希望指定注解的使用范围,请使用注解@Target,后面指定范围属性;
若希望类的注解能被子类应用,则使用@Inherited ;方法的注解重载后不能被继承。
若参数只有一个,则可以将参数名称设置为value;在使用该注解时,参数名称可以忽略不写。如下示例:
@interface V{ String value(); } @interface V2{ String val(); } @V("") //可以忽略参数名 @V2(val="") //参数名必填 class CV{ @V(value ="") public void v1(){} }
相关推荐
尽量不在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,而且是整个应用的基础常量。 单选 10.集合在遍历过程中,有时需要对符合一定条件的元素进行删除,下列哪些说法是正确的:B A .在 foreach ...
本文档详细介绍了Java中的注释类型,包括单行注释、多行注释和文档注释。示例代码演示了如何在Java程序中使用这些注释。通过学习本文,您将了解以下内容: 不同类型的注释及其用途; 如何在Java程序中正确使用注释...
《零基础学C#》是针对零基础编程学习者全新研发的C#入门教程。...书中所有知识都结合具体实例进行讲解,设计的程序代码给出了详细的注释,可以使读者轻松领会C#程序开发的精髓,快速提高开发技能。
书中所有知识都结合具体实例进行讲解,设计的程序代码给出了详细的注释,可以使读者轻松领会C#程序开发的精髓,快速提高开发技能。 本书通过大量实例及一个完整项目案例,帮助读者更好地巩固所学知识,提升能力;随...
自购零基础学C#课后源代码从初学者角度出发,通过通俗易懂的语言、流行有趣的实例,...书中所有知识都结合具体实例进行讲解,设计的程序代码给出了详细的注释,可以使读者轻松领会C#程序开发的精髓,快速提高开发技能。
《Java基础课程全套笔记.doc》是一份珍贵的学习资源,专为那些希望深入研究和掌握Java编程高级概念的学习者和开发者而创建。以下是对这个资源的详细描述: 全面的高级主题覆盖:这份文档涵盖了Java编程的高级主题,...
python基础实验报告答案_20192221实验⼀《Python程序设 计》实验报告 学号 2019-2020-2 《Python程序设计》实验x报告 课程:《Python程序设计》 班级:1922班 姓名:叶蕊馨 学号:20192221 实验教师:王志强⽼师 ...
《零基础学C#》是针对零基础编程学习者全新研发的C#入门教程。...书中所有知识都结合具体实例进行讲解,设计的程序代码给出了详细的注释,可以使读者轻松领会C#程序开发的精髓,快速提高开发技能。
掌握Java语法和基础:掌握Java的语言特性、数据类型、运算符、控制结构、面向对象编程等基础知识点。 掌握Java标准库:掌握Java标准库中的重要类和接口,如String、ArrayList、HashMap、Thread、Socket等。 掌握Java...
它包含了从基础到高级的完整知识体系,以及实际项目操作的全部流程。具体内容包括: 项目背景与目标:详细介绍了“系统管理”项目的起源、目的和核心功能。 技术栈概览:涵盖了Spring、SpringMVC、MyBatis等主流...
JavaWeb之基础(手写实现Tomcat服务器) java多线程编程 纯手写实现SpringIOC实现过程 JEE企业级开发(企业级项目开发权威指南) 网络爬虫之JAVA正则表达式 手写springMVC框架 老司机带你透析springMVC内部实现方式 打造...
技能目标 能够在MyEclipse IDE中定义标识符、变量和常量;使用关键字及分隔符。 01 能够在MyEclipse IDE中编写适当的Java注释。 02 能够在MyEclipse IDE中运用基本数据类型并进行数据类型转换。 03 能够在MyEclipse...
确保所选主题既具有挑战性又能够展示你的C语言编程技能。 进行问题分析:一旦确定了项目主题,你需要对问题进行深入分析。这包括确定问题的输入和输出、理解问题的要求和限制条件,以及将复杂问题分解为更小的子问题...
* * 程序设计基础 1 程序设计的方法和风格 2 结构化程序设计 3 面向对象方法 程序设计的方法与风格 良好的程序设计风格:书写源程序的习惯、程序代码的逻辑结构与习惯的编程技术。 1.源程序文档化 命名要见名知意:...
首先从基础讲起,介绍了如何编译和运行java程序,然后讨论了关键字、语法和一些结构,它们共同构成了java语言的核心。之后,《新手学java7编程(第5版)》介绍了java的一些高级特性,包括多线程程序设计和泛型。最后以...
通过本项目,您可以学习到如何利用前端技术创建动态烟花效果,从而为网页...通过本资源的学习和实践,你不仅能够为新年增添精彩的烟花效果,还能在此过程中提升自己的前端开发技能,为未来的更多创意项目奠定坚实的基础
基于Python+OpenCV实现的之人机交互打地鼠源码+超详细注释+实验报告+演示视频.zip 实验报告 ### 实验类别 勇于创新类 ### 实验主题 其他 ### 实验内容 手势识别版打地鼠 ![myImg](56600791D64D4136BEBE86266721...
1.具有扎实的Java基础,对面向对象编程有深刻的理解,熟练掌握java IO流、集合、多线程、反射,泛型,注解,网络编程等基础开发技术; 2.熟练使用常用的java集合类以及常用集合的源码,熟悉多线程以及同步容器以及...
毕业设计是高等教育阶段学生在完成学业前所进行的一项...总的来说,毕业设计是高等教育中的一项重要环节,通过此过程,学生不仅能够巩固所学知识,还能培养独立思考和解决问题的能力,为将来的职业发展奠定坚实的基础。
这本电子主要包括C#从基础到高级,从零开发学C#。所有知识都结合具体实例进行介绍,涉及的程序代码给出了详细的注释,可以使读者轻松领会C#应用程序开发的精髓,快速提高开发技能。