一.概念
- 用于说明程序,又称为Java标注。于jdk1.5开始引入。
二.作用
1.编译检查,如@Overrid
2.编写文档,如@Author
3.代码分析(利用反射)
三.使用
1. JDK预定义注解
1.1@Deprecated
用于标识过时方法
2.自定义注解
2.1格式
2.1.1 元注解(用于描述注解的注解)
- @Retention
描述注解的保留阶段。对应java代码经历的三个阶段:SOURCE,CLASS,RUNTIME - @Target
描述注解作用的位置。使用了一个枚举类来定义。
public enum ElementType {
/** 类,接口(包括注解类型)或枚举的声明 */
TYPE,
/** 属性的声明 */
FIELD,
/** 方法的声明 */
METHOD,
/** 方法形式参数声明 */
PARAMETER,
/** 构造方法的声明 */
CONSTRUCTOR,
/** 局部变量声明 */
LOCAL_VARIABLE,
/** 注解类型声明 */
ANNOTATION_TYPE,
/** 包的声明 */
PACKAGE
}
- @Document
描述注解是否被抽取到api文档 - @Inherited
描述是否被子类继承
2.1.2注解声明
Public @Interface 注解名 {
属性列表
}
2.1.2.1 属性
- 概念:注解中定义的成员方法。
- 返回值类型:基本数据类型,String,枚举类,注解,以上类型的数组
- 使用注意:如果定义了属性,并且没有设置默认值的话,再使用时必须给属性赋值。以下是设置默认值的示例:
Public @Interface XXX{
String name default "萨拉瓦";
}
四.本质
注解其实是自动继承java.lang.annotation.Annotation的接口。
五.在程序中获取注解中的属性值
- 获取注解定义位置的对象(Field,Method,Class...)
- 获取指定的注解对象
XX.getAnnotation(class)
3.调用注解抽象方法,获取配置的值
六.特殊语法
六.特殊语法部分转载自:https://blog.csdn.net/xsp_happyboy/article/details/80987484
特殊语法一:
如果注解本身没有注解类型元素(属性),那么在使用注解的时候可以省略(),直接写为:@注解名,它和标准语法@注解名()等效!
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.TYPE})
@Documented
public @interface FirstAnnotation {
}
//等效于@FirstAnnotation()
@FirstAnnotation
public class JavaBean{
//省略实现部分
}
特殊语法二:
如果注解本本身只有一个注解类型元素,而且命名为value,那么在使用注解的时候可以直接使用:@注解名(注解值),其等效于:@注解名(value = 注解值)
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.TYPE})
@Documented
public @interface SecondAnnotation {
String value();
}
//等效于@ SecondAnnotation(value = "this is second annotation")
@SecondAnnotation("this is annotation")
public class JavaBean{
//省略实现部分
}
特殊用法三:
如果注解中的某个注解类型元素是一个数组类型,在使用时又出现只需要填入一个值的情况,那么在使用注解时可以直接写为:@注解名(类型名 = 类型值),它和标准写法:@注解名(类型名 = {类型值})等效!
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.TYPE})
@Documented
public @interface ThirdAnnotation {
String[] name();
}
//等效于@ ThirdAnnotation(name = {"this is third annotation"})
@ ThirdAnnotation(name = "this is third annotation")
public class JavaBean{
//省略实现部分
}
特殊用法四:
如果一个注解的@Target是定义为Element.PACKAGE,那么这个注解是配置在package-info.java中的,而不能直接在某个类的package代码上面配置。
网友评论