Java基础 注解Annotation

来源:互联网 发布:照片数字识别软件 编辑:程序博客网 时间:2024/06/05 15:48
注解Annotation
注解介绍
定义
注解annotation是Java语言中用于描述类,成员变量,构造方法,成员方法,方法参数及包声明的特殊的修饰符.用于描述这些信息的元数据.例如@Override用于描述一个方法是在子类中重写的方法
特点
是JDK5.0之后引入的特性.注解是以”@注解名”在代码中存在的
作用
创建文档
跟踪代码依赖性
执行编译时格式检查
代替已有的配置文件
分类
根据注解的参数个数分为三类:
标记注解:没有参数的注解,仅用自身的存在与否为程序提供信息,如@Override 注解,该注解没有参数,用于表示当前方法为重写方法
单值注解:只有一个参数的注解,如果该参数的名字为value,那么可以省略参数名,如@SuppressWarnings(“all”),可以简写为@SuppressWarnings(“all”).
完整注解:有多个参数的注解
根据注解的使用方法和用途分为三类:
JDK内置注解,JDK1.5之后内置了三个系统注解
@Override
标记在成员方法上,用于标识当前方法是重写父类方法,编译器在对该方法进行编译时会检查是否符合重写规则,如果不符合,编译报错
@Deprecated
用于标记当前类、成员变量、成员方法或者构造方法过时
如果开发者调用了被标记为过时的方法,编译器在编译期进行警告
@SuppressWarnings
可放置在类和方法上,该注解的作用是阻止编译器发出某些警告信息,该注解为单值注解,只有一个value参数,该参数为字符串数组类型,参数值常用的有
unchecked
未检查的转化,如集合没有指定类型
unused
未使用的变量
resource
有泛型未指定类型
path
在类路径,原文件路径中有不存在的路径
deprecation 
使用了某些不赞成使用的类和方法
fallthrough
switch语句执行到底没有break关键字
serial
某类实现Serializable 但是没有定义serialVersionUID
rawtypes
没有传递带有泛型的参数
all
全部类型的警告 

元注解
定义
用户负责描述其他注解的注解
在自定义注解时,需要指定注解可以应用在哪些位置(如:方法,参数,类上等)以及自定义注解的停留策略等信息,那么就可以通过元注解去描述这些信息了.
类型
JDK1.5中定义了四个元注解
@Target
作用:用于描述当前定义的注解可以应用的范围
该注解仅有一个属性value,该属性值为ElementType数组类型
ElementType为枚举类型,枚举值和作用说明如下:
TYPE
当前定义的注解可以应用在类、接口和枚举的类型定义部分
FILED
当前定义的注解可以应用在成员变量上
METHOD
当前定义的注解可以应用在成员方法上
PARAMETER
当前定义的注解可以应用在方法参数上
CONSTRUCTOR
当前定义的注解可以应用在构造方法上
LOCAL_VARIABLE
当前定义的注解可以应用在局部变量上
ANNOTATION_TYPE
当前定义的注解可以应用在注解类型上
PACKAGE
当前定义的注解可以应用在包定义语句上
@Retention
作用:用于描述当前定义的注解可以保留的时间长短
该注解只有一个value参数,参数类型为RetentionPolicy
RetentionPolicy类型为枚举类型
SOURCE
当前定义的注解仅仅停留在源码中,编译时即除去
CLASS
当前定义的注解保留到编译后的字节码中,运行时无法获取注解信息
RUNTIME
当前定义的注解可以保留到运行时,通过反射机制可以获取注解信息

@Documented
作用:用于标示当前定义的注解可以被Javadoc文档生成器记录,默认情况下javadoc文档生成器生成的文档是不包含注解信息的,但是@Documented标示的注解可以被javadoc文档生成器识别,并且包含到生成的文档信息中
该注解是标示型注解,没有任何参数
@Inherited
作用:用于标示当前定义的注解应用到某一个父类上时,子类会将继承该注解
该注解是标示型注解,没有任何参数
同时如果为定义的注解指定了@Inherited修饰,那么这个自定的注解的@Target的参数值需要指定为TYPE
自定义注解
语法
注解定义语法
public @interface 注解名{注解体}
注解中参数定义语法
[public] 参数类型 参数名() [default 默认值];
定义注解参数注意事项
参数类型
8种基本数据类型byte short int long float double char boolean
String Class enum Annotation
以及上述类型的数组类型
参数只能使用public修饰,默认就会使用public修饰
如果只有一个参数,最好把参数名定义为value,这样使用该注解时可以更加简洁
参数可以使用default定义默认值,参数为引用类型时默认值不能为null
参数如果定义了默认值,在使用注解时可以不为其指定值,否则在使用该注解必须为该参数指定值
解析注解信息
JDK1.5后,java.lang.reflect报下新增了AnnotatedElement接口,该接口为运行时通过反射机制获取注解信息提供API,该接口中定义了如下四个方法
方法
方法说明
T getAnnotation(Class<T> clazz)
通过注解类型返回此元素上注解对象
Annotation[] getAnnotations()
返回此元素上所有的注解,包括继承到的注解
Annotation[] getDeclaredAnnotations()
返回直接定义在此元素上的所有注解
boolean isAnnotationPresent(Class<T> cls)
判断此元素上是否存在指定的注解



原创粉丝点击