1、注解
java中的注解(Annotation),也叫元数据。是Java5以后版本引入的一个特性。
注解与类、接口、枚举是在同一个层次,可以用来标注包、类、字段、方法、局部变量、方法参数等元素,达到对这些元素的描述和说明。
注解是可以允许jvm在运行中读取它,这一点与注释完全不同。并且包含多种加载策略,可以灵活配置。
常见的注解:
@Override
它用来对覆盖父类方法、实现接口方法进行标记,如果被标记的方法并没有实际覆盖父类方法,则编译器会发出错误警告。
@Deprecated
它用来标记过期方法、不推荐使用方法。对于某些已经过期、不推荐使用的方法,但又不能直接删除(有其他地方仍使用),我们会使用@Deprecated进行标记,当使用这些方法时,会在编译时进行提示。
@SuppressWarnings
它用来标记不想被提示的警告,警告类型可以通过参数控制,具体如下:
deprecation,使用了过时的类或方法时的警告
unchecked,执行了未检查的转换时的警告
fallthrough,当Switch程序块直接通往下一种情况而没有Break时的警告
path,在类路径、源文件路径等中有不存在的路径时的警告
serial,当在可序列化的类上缺少serialVersionUID定义时的警告
finally,任何finally子句不能正常完成时的警告
all,关于以上所有情况的警告
-------------------------------------------------------------------------------------------------------
自定义注解:
语法:public @interface 注解名 {定义体} default {默认值}
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。
@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型。通过default来声明参数的默认值,如果不指定default,则说明该参数为必填。
注解参数(注解方法的返回值)的只能用public或默认(default)这两个访问权修饰,并且只支持以下数据类型:
所有基本数据类型(int,float,boolean,byte,double,char,long,short)
String类型
Class类型
enum类型
Annotation类型
以上所有类型的数组
一般是用反射来获取注解。例:
注解类:
@Retention(RetentionPolicy.RUNTIME)
public @interfaceTestAnnotation {
String name() default "";
}
被注解的类:
public classTestInfo {
@TestAnnotation(name = "公司名称")
private String company;
@TestAnnotation(name = "职位")
private String position;
}
使用注解:
public classTestMain {
public static void main(String[] args) {
Field[] fields =TestInfo.class.getDeclaredFields();
for (Field field : fields) {
if(field.isAnnotationPresent(TestAnnotation.class)) {
TestAnnotation testAnnotation =(TestAnnotation) field.getAnnotation(TestAnnotation.class);
System.out.println("field:" + field.getName() + ",annotation:" + testAnnotation.name());
}
}
}
}
field:company,annotation:公司名称
field:position,annotation:职位
其中注解类中的注解@Retention(RetentionPolicy.RUNTIME),是用来修饰注解的注解,即元注解,用来描述和限定自定义注解的使用场景和约束。
-------------------------------------------------------------------------------------------------------
元注解就是负责注解其他注解
Java 5定义了4个标准的元注解(meta-annotation):@Target、@Retention、@Documented、@Inherited,这些元注解的类在java.lang.annotation包中,具体如下:
@Target
@Target说明了注解所修饰的对象范围,即所定义的注解可以用在什么地方。具体的取值有:
CONSTRUCTOR 用于描述构造器
FIELD 用于描述类中的属性(域)
LOCAL_VARIABLE 用于描述局部变量
METHOD 用于描述方法
PACKAGE 用于描述包
PARAMETER 用于描述方法参数
TYPE 用于描述类、接口(包括注解类型) 或enum声明
@Retention
@Retention定义了注解如何被保留,即被描述的注解在什么范围内有效。具体的取值有:
SOURCE 在源文件中有效(即源文件保留)
CLASS 在class文件中有效(即class保留)
RUNTIME 在运行时有效(即运行时保留)
我们在《如何自定义注解》文章中的实例中使用了@Retention(RetentionPolicy.RUNTIME),也就是说该自定义注解在运行时能够被读取和使用。
@Documented
@Documented定义了注解可以作为公共API,可以被例如javadoc此类的工具文档化。Documented是一个标记注解,并没有任何成员。
@Inherited
@Inherited允许子类继承父类的注解。即一个使用了@Inherited修饰的注解被用于某个类,则该类的子类也等同于被该注解修饰。