---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
注解
(是JDK1.5的新特性(枚举也是1.5新特性))
一个注解就是一个类,也是一个特殊的类
1:注解(Annotation)相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记。以后,javac编译器、开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事
2:标记可以加在包,类,字段,方法,方法的参数以及局部变量上
3:在java.lang包中提供了最基本的注解(annotation)
4:注解类的格式:@interface A{}//相当于在接口上加上一个“@”
示例:
public @interface ItcastAnnotation
{//这就是一个注解类
}
如果只有一个value名称的属性或其他属性缺省,则可@注解名(”属性值”)
如果有多个或不缺省或者需重新赋值,则@注解名(属性名=”属性值”,…)
注解的结构
java中三种基本的注解
1、如@SuppressWarning(”deprecation”):表示忽略过时警告;或者说不要警告过时提示了
SupressWarning是告知编译器或开发工具等不需要再提示指定的警告了;
“deprecation”是警告的信息,即过时警告。
2、@Deprecated:表示告知调用者,该成员函数、字段等已经过时,不再推荐使用。
源代码标记@Deprecated是在JDK1.5中作为内置的annotation引入的,用于表明类(class)、方法(method)、字段(field)已经不再推荐使用,并且在以后的JDK版本中可能将其删除,编译器在默认情况下检测到有此标记的时候会提示警告信息。
例如:假定之前的某个类升级了,其中的某个方法已经过时了,不能够将过时的方法删除,因为可能会影响到之前调用此这个方法的某些程序,这时就可以通过在方法上加这个注解来标记。
3、@Override:表示下面的方法是在覆盖(父类方法),如果不存在覆盖,就会报错。
加上此注解,可对类中的方法判断是否是要覆盖的父类的方法。典型的例子即在类中覆盖equals(Objectobj)方法时,其中的参数类型必须是Object,才能被覆盖;若不是,则不存在覆盖。此时如果加上了此注解就会提示警告。
注解的生命周期
(1)有三个阶段
1:Java源文件 2:class文件阶段 3:内存中的字节码
@Retention:此注解是用于说明某个注解处于哪个阶段
此注解有三种取值:RetetionPolicy.SOURCE、RetetionPolicy.CLASS、RetetionPolicy.RUNTIME
(2)@Traget:此注解适用于说明某个注解能够加载在类的哪个成分上
其值可设置为枚举类ElementType类中的任何一个,包括:包、字段、方法、方法参数、构造器、类等值。取值为:
PACKAGE(包声明)
FIELD(字段声明)
ANNOTATION_TYPE(注释类型声明)
CONSIRUCTOR(构造器声明)
METHOD(方法声明)
PARAMETER(参数声明)
TYPE(类、接口(包含注释类型)或枚举声明)
LOCAL_VARIABLE(局部变量声明)
注意:其中代表类的值是TYPE。因为class、enum、interface和@interface等都是平级的,所以统属于Type。不可用CLASS表示
注解的属性
(1)注解也有属性,一个注解相当于一个胸牌,但仅通过胸牌还不足以区别带胸牌的两个人,这时就需要给胸牌增加一个属性来区分,如颜色等,在用的时候设置属性
(2)注解的属性,其实可以当做方法来看
在用反射取得属性的时候,就是把属性当做方法,获取属性用的就是获取属性的方法
(3)注解属性的定义 String color();
也可以为属性定义缺省值:Stringcolor default “yellow”;
在使用注解的时候,就为注解设置属性值
示例:@ ItcastAnnotation(color= “red”)//如果没有设置,就默认为缺省值
(4)如果注解的内部只有一个属性需要设值,假设注解只有color一个属性需要设值
那么可以简写为@ ItcastAnnotation(“red”)
注解的高级属性
1、可以为注解增加的高级属性的返回值类型有:
1)八种基本数据类型
2)String类型
3)Class类型
4)枚举类型
5)注解类型
6)前五种类型的数组
2、数组类型的属性:
如:int[]arrayArr() default {1,2,3};//可不定义默认值
应用:@MyAnnotation(arrayArr={2,3,4}) //可重新赋值
注:若数组属性中只有一个元素(或重新赋值为一个元素),这时属性值部分可省略大括号。
3、枚举类型的属性:
假设定义了一个枚举类TrafficLamp,它是EnumTest的内部类,其值是交通灯的三色。
定义:EnumTest.TrafficLamplamp();
应用:@MyAnnotation(lamp=EnumTestTrafficLamp.GREEN)
4、注解类型的属性:
假定有个注解类:MetaAnnotation,其中定义了一个属性:String value()
定义:MetaAnnotation annotation() default@MetaAnnotation(”xxx”);
应用:@MyAnnotation(annotation=@MetaAnnotation(”yyy”))//重新赋值
可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象,同样的道理,可以认为上面这个@MetaAnnotation是MetaAnnotation类的一个实例对象,调用代码如下:
MetaAnnotationma =MyAnnotation.annotation();
System.out.println(ma.value());
5、Class类型的属性:
定义:Class cls();
应用:@MyAnnotation(cls=AnnotationDemo.class)
注:这里的.class必须是已定义的类,或是已有的字节码对象
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net