注解annotation--特殊的Java类
举例:
@SuppressWarnings(" ")忽略警告
@Deprecated生命为过时的
@Override重写时添加该标签可防止出错
举例:如将Student加入到HashSet中需重写equals(Object obj)
不慎将Object-->Student则出错(不能实现比较)
应用:定义注解类@interface A{}
某个类应用注解类@A class B{}
对应用了注解类的类进行反射操作
class C{
B.class isAnnotationPresent(A.class);是否存在注解
A a =B.class.getAnnotation(A.class);得到
}
自定义注解及其应用:
定义:public @interfac MyAnnotatione{}
加在某个类上 @MyAnnotation
public class AnnotationTest{}
@Retention 元注解 (只能放在注解的定义上)
@Retention (RetetionPolicy.SOURCE)
RetetionPolicy枚举类型,缺省value=
value:RetionPolicy存在策略
RetetionPolicy.SOURCE 源文件 编译器要丢弃的注释。@Override @SupposeWarning
RetetionPolicy.CLASS 类文件 编译器将把注释记录在类文件中,但在运行时 VM 不需
要保留注释 默认设定
RetetionPolicy.RUNTIME 内存中的字节码 编译器将把注释记录在类文件中,在运行时
VM 将保留注释,@deprecated
因此可以反射性地读取。
@Target ({ElemetType.METHOD,ElementType.TYPE})元注解
ELEMENTTYPE注解目标参数可以为数组{,,}
注解的属性:
注解的属性只能是one of the primitive types(eg:IntegerType CharType ByteType) ,String,Class,an enum type
an annotation type or an array of one of the preceding types.
@interface MyAnnotation{
String color();
int [] arrayAttr();
EnumTest.TrafficLamp lamp();//EnumTest.TrafficLamp 枚举类型
MetaAnnotation annotation();
}
@intrtface MetaAnnotation{
String value();
}
举例:定义注解的属性String color();
注解中的属性以方法的形式定义(公有抽象缺省public abstract)
应用注解的属性 @MyAnnotation(color="red")
特殊属性 value()只有value需要设定可省略"value="
当其他属性有缺省值也可按上述方法设定
数组类型的属性:
注解中增加数组属性
int [] arrayAttr();
@MyAnnotation(color="red",arrayAttr={1,2,3})
注意及时应用反射也无法得到属性arratAttr中各元素的值,但可得到数组的长度
仅有一个元素可省大括号,可设缺省值
枚举类型的属性:
注解中增加枚举类型的属性,可设缺省值
@Retention (RetetionPolicy.SOURCE)
RetetionPolicy枚举类型,缺省value=
注解类型的属性:
注解中增加注解类型的属性,
@MyAnnotation(color="red",arrayAttr={1,2,3},annotationAttr=@MetaAnnotation("lhm"))
创建注解的实例对象
@+标记
{
MetaAnnotation annotation() default @MetaAnnotation("lwa");
}
枚举和注解都是特殊的类,不能用new创建他们的实例,创建枚举的实例对象就是在其中增加元素。创建注解的实例对象就是@加标记
注解属性的返回值只能是基本数据类型,字符串,.class,注解,枚举,或者是他们的数组。
总结:注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。