什么是注解?它的作用是什么?
注解:annotation ,是java代码里的特殊标记。它为我们的代码中添加用java程序无法表达的额外信息提供了一种形式化的方法,使我们可以在未来的某一个时刻方便的使用这些被注解修饰的程序元素。
注解的作用:
①用将由编译器来测试和验证的格式,存储有关程序的额外信息 ②生成描述符文件,甚至是新的类定义 ③减轻编写模版代码的负担 ④使代码更加干净易读
修饰程序元素:类,方法,成员变量
注解和注释的区别:
都属于代码的描述
注释不会被代码读取,注解在编译,加载中被代码加载
注解的类型是一种接口,存在于java.lang.anotation
语法@+AnnotationName
1不带参数的注解语法:
@Override
2带一个参数的注解语法
@SuppressWarnings(value=“unused”)
3带多个阐述的注解语法:
@Annotation({“参数1”,”参数2”,....})
示例:@MyTag(name=”jack”,age=20)
注解规范:
注解放在所有修饰符之前
注解分为:
内建注解
限定重写父类方法:@Override
@Override被用作标注方法,它说明了被标注的方法重写了父类的方法,起到了断言的作用
使用方法: 在要重写父类方法的子类方法前加上@Override即可
使用范围:只能用于修饰方法,不能用于修饰其他
标示已过时:@Deprecated
用于表示某个程序元素(类、方法、成员变量等)已过时,当其他程序使用已过时的程序元素时,编译器会给出警告
抑制编译器警告:@SuppressWarnings
@SuppressWarnings指示被注解标识的程序元素及其子元素取消显示指定的编译器警告
@SuppressWarnings会一直作用于该程序元素的所有子元素
常用value值 参数:
deprecation:编译器将取消使用了过时程序元素的警告
unchecked:取消执行了未检查的转换
unused:取消某程序元素未被使用的警告
fallthrough: 取消当swithc 程序块直接通往下一种情况而没有break时的警告
path: 取消在类路径、源文件路径等中有不存在的路径时的警告
serial :取消当在序列化的类上缺少serialVersionUID定义时的警告
finally :取消当有finally子句不能正常完成时的警告
all: 取消所有情况的警告
如何成员变量是一个数组,则使用大括号
元注解-Meta Annotation
@Target
用于指定被修饰的注解能用于修饰哪些程序元素
@Target注解类型有唯一的value作为成员变量,value的类型为java.lang.annotation.ElementType[]类型
Value标注
ElementType.ANNOTATION_TYPE:被修饰的注解只能用来修饰注解
ElementType.CONSTRUCTOR:只能修饰构造方法
ElementType.FIELD:只能修饰成员变量
ElementType.LOCAL_VARIABLE:只能修饰局部变量
ElementType.METHOD:只能修饰方法声明
ElementType.PACKAGE:只能修饰包
ElementType.PARAMETER:只能用来修饰参数
ElementType.TYPE:可以用来修饰类、接口、枚举声明
使用方法:
@Retention
描述了被其修饰的注解是否被编译器丢弃或者保存在class文件中。如果保存在class文件中,是否在class文件被装载时被虚拟机所读取。默认情况下,注解被保存在class文件中,但在运行时并不能被反射访问。
@Retention包含一个RetentionPolicy类型的value成员变量,使用@Retention时必须为该value成员变量指定值。
@Retention中唯一的value成员变量的取值,来自于java.lang.annotation.RetentionPolicy的枚举类型值
RetentionPolicy.CLASS(默认值):编译器将把注解记录在class文件中,当运行Java程序时,Java程序时,Java虚拟机不再保留注解
RetentionPolicy.RUNTIME:编译器将把注解记录在class文件中,当运行Java程序时,Java虚拟机也会保留注解,程序可以通过反射获取该注解
RetentionPolicy.SOURCE 编译器将直接丢弃被修饰的注解
@Documented
用于指定被其修饰的注解将被javadoc工具提取成文档
如果定义注解时使用了@Documented修饰,则所有使用该注解修饰的程序元素的API文档中都将包含该注解说明
@Documented注解类型没有成员变量
@Inherited
指定被修饰的注释将具有继承性
如果某个类使用了定义时被@Inherited修饰的注解,则其子类会自动具有这个注解。
注意:被@INHERITED注解修饰的注解是被注视过的类的子类所继承,类并不从它所实现的接口继承该类型的注解,方法也不能从它所有重载的方法中继承这种注解。
自定义注解
使用@interface自定义注解
注解类型使用关键字@interface而不是interface
注解类型的方法定义是独特的、受限制的
注解类型与接口的相似之处
都可以定义常量、静态成员的类型。注解类型也可以像接口一样被现实或被继承