目录
Annotation是在JDK1.5之后新增的特性,称为元数据特性。使用注释的方式加入一些程序的信息,Java.lang.annotation.Annotation接口是所有的Annotation都必须实现的接口。
系统内建的annotation
以下三个内建的Annotation类型用户可以直接使用:
- @Override:表示覆写的注解
- @Deprecated:表示废弃的注解
- @SuppressWarnings:表示压制安全警告的注解
以上3个注解的定义如下:
序号 | Annotation | JAVA中的声明 |
1 | @Override | @Target(value=METHOD) @Retention(value=SOURCE) public @interface Override |
2 | @Deprecated | @Documented @Retention(value=RUNTIME) @Target(value={CONSTRUCTOR,FIELD,LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER,TYPE}) public @interface Deprecated |
3 | @SuppressWarnings | @Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE}) @Retention(value=SOURCE) public @interface SuppressWarnings |
@Override
表示方法覆写的正确性,如果不使用此注解,那么当子类想覆写父类中的方法时不小心写错了就达不到最初的目的了。
代码示例:
class Person{
public String getInfo(){return "这是一个Person类";}
}
class Student extends Person{
@Override
public String getInfo(){
return "这是一个Student类";
}
}
public class OverrideAnnotationDemo01 {
public static void main(String [] args){
Person per = new Student();
System.out.println(per.getInfo());//输出信息
}
}
如果将getInfo修改为其它名称,编辑器就会提示语法错误:
所以Override注解就是用来保证覆写的正确性。
@Deprecated
表示方法已经过时了,不推荐使用,本身不建议使用此操作。
代码示例:
class Person{
@Deprecated
public String getInfo(){return "这是一个Person类";}
}
public class DeprecatedAnnotationDemo01 {
public static void main(String [] args){
Person per = new Person();
System.out.println(per.getInfo());//输出信息
}
}
以上程序编译时会提示以下信息:
@SuppressWarnings
用来压制警告信息。在之前的泛型操作时,如果没有指定泛型的类型,那么使用时会出现安全警告。
代码示例:
class Demo<T>{
private T var;
public void setVar(T var){
this.var=var;
}
public T getVar(){
return this.var;
}
}
public class SuppressWarningsAnnotationDemo01 {
public static void main(String [] args){
Demo d = new Demo();
d.setVar("张三");
System.out.println("内容:"+d.getVar());
}
}
以上程序编译提示以下信息:
此时可以使用SupressWarnings压制此警告信息:
代码示例:压制unchecked警告信息
class Demo<T>{
private T var;
public void setVar(T var){
this.var=var;
}
public T getVar(){
return this.var;
}
}
public class SuppressWarningsAnnotationDemo01 {
@SuppressWarnings("unchecked")
public static void main(String [] args){
Demo d = new Demo();
d.setVar("张三");
System.out.println("内容:"+d.getVar());
}
}
也可以同时压制多个警告信息,只需要以数组的形式出现即可。
代码示例:压制多个警告信息
class Demo<T>{
private T var;
public void setVar(T var){
this.var=var;
}
public T getVar(){
return this.var;
}
}
public class SuppressWarningsAnnotationDemo01 {
@SuppressWarnings({"unchecked","deprecation"})
public static void main(String [] args){
Demo d = new Demo();
d.setVar("张三");
System.out.println("内容:"+d.getVar());
}
}
在设置注释信息的时候,以key->value的形式出现的,所以以上的@SuppressWarnings也可以直接使用”value={"unchecked","deprecation"}”的方式设置。
自定义annotation
语法
Annotation的定义格式为:
[public] @interface Annotation 名称{
数据类型 变量名称();
}
代码示例2:定义无参数的注解
public @interface MyDefaultAnnotationNonePara {
}
之后就可以在程序中使用此注解了,代码如下:
@MyDefaultAnnotationNonePara
public class MyAnnotationDemo01 {
};
注意:要先编译注解文件,再编译使用注解的类
代码示例2:定义1个参数的注解
public @interface MyDefaultAnnotationSinglePara {
public String value();//接收设置的内容
}
在程序中使用此注解,代码如下:
@MyDefaultAnnotationSinglePara( "笑笑")
@MyDefaultAnnotationNonePara
public class MyAnnotationDemo01 {
};
也可以使用变量接收参数,以上代码等价于
@MyDefaultAnnotationSinglePara(value = "笑笑")
@MyDefaultAnnotationNonePara
public class MyAnnotationDemo01 {
};
代码示例3:定义多个参数的注解
public @interface MyDefaultAnnotationMorePara {
public String value();//接收设置的内容
public String key();
}
在程序中使用此注解,代码如下:
@MyDefaultAnnotationMorePara(key="ksh",value="xiaoxiao")
@MyDefaultAnnotationSinglePara(value = "笑笑")
@MyDefaultAnnotationNonePara
public class MyAnnotationDemo01 {
};
代码示例4:注解接收一个数组
public @interface MyDefaultAnnotationArrayPara {
public String [] value();//接收设置的内容
}
在程序中使用此注解,代码如下:
@MyDefaultAnnotationArrayPara({"xiaoxiao","lily","heby"})
@MyDefaultAnnotationMorePara(key="ksh",value="xiaoxiao")
@MyDefaultAnnotationSinglePara(value = "笑笑")
@MyDefaultAnnotationNonePara
public class MyAnnotationDemo01 {
};
也可以用value参数接收数组。以上所有的Annotation中,所有的参数内容需要在使用注解的时候设置上去,其实也可以像函数的默认参数一样,声明的时候使用default。
代码示例5:定义默认参数的注解
public @interface MyDefaultAnnotationDefaultPara {
public String key() default "ksh";//指定好默认值
public String value() default "xiaoxiao";//指定好默认值
}
在程序中使用此注解,代码如下:
@MyDefaultAnnotationDefaultPara()
@MyDefaultAnnotationArrayPara({"xiaoxiao","lily","heby"})
@MyDefaultAnnotationMorePara(key="ksh",value="xiaoxiao")
@MyDefaultAnnotationSinglePara(value = "笑笑")
@MyDefaultAnnotationNonePara
public class MyAnnotationDemo01 {
};
如果在操作中,注解在固定的范围内取几个值,这时就需要依靠枚举。
代码示例6:注解在枚举中取值
enum MyEnum{
KSH,XIAOXIAO,KONGSH;
}
public @interface MyDefaultAnnotationEnum {
public MyEnum name() default MyEnum.KONGSH;//指定好默认值
}
在程序中使用此注解,代码如下:
@MyDefaultAnnotationEnum(name=MyEnum.KSH)
@MyDefaultAnnotationDefaultPara()
@MyDefaultAnnotationArrayPara({"xiaoxiao","lily","heby"})
@MyDefaultAnnotationMorePara(key="ksh",value="xiaoxiao")
@MyDefaultAnnotationSinglePara(value = "笑笑")
@MyDefaultAnnotationNonePara
public class MyAnnotationDemo01 {
};
注意:
- 使用注解时也必须从枚举中取值;
- 当注解中的参数名称不是value时,使用注解必须指定参数名,如果为value的话可以直接传参。
Retention和RetentionPolicy
在注解中,可以使用Retention注解定义注解的保存范围,Retention注解的定义如下:
以上定义中存在了一个RetentionPolicy的变量,值为RUNTIME,此变量用于指定注解的保存范围。RetentionPolicy包含三种范围:
以上3个范围中,最需要关心的就是RUNTIME,因为在执行的时候才起作用。
代码示例:自定义注解,保存范围为RUNTIME
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(value= RetentionPolicy.RUNTIME)//表示在运行时有效
public @interface MyDefaultRetentionAnnotation {
public String name() default "ksh";//
}