首页 > Java > 高新技术(五) 注解
2014
06-03

高新技术(五) 注解

注解(Annotation):用于向编译器(javac)传达某种信息,注解可以加在包、类、字段、方法、方法的参数以及局部变量上。JDK提供了三个基本的注解,位于java.lang包中,如下:

@Deprecated:标记某个方法过时

@Override:强制子类覆写父类方法

@SuppressWarnings 抑制警告 如:@SuppressWarnings(“deprecation”)

① 注解的定义与反射调用

annotation def and use

第一个例子:定义一个注解@MyAnnotation,在AnnotationTest类上应用该注解,然后对AnnotationTest类进行反射操作获得注解对象并打印。

@Retention(RetentionPolicy.RUNTIME)  //元注解
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface MyAnnotation {

}
------------------割----------------------
@MyAnnotation
public class AnnotationTest {
	public static void main(String[] args){
		if(AnnotationTest.class.isAnnotationPresent(MyAnnotation.class)){
			MyAnnotation annotation = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
			System.out.println(annotation);
		}
	}

}

在定义MyAnnotation时用到了两个注解@Retention、@Target(元注解:注解的注解,ElementType为ANNOTATION_TYPE):

—- @Retention:指示@MyAnnotation的注解要保留多久,值为RetentionPolicy对象。

—- @Target:指示@MyAnnotation所适用的程序元素的种类,值为ElementType数组。

RetentionPolicy、ElementType为java.lang.annotation包中定义的两个枚举类型:

—- RetentionPolicy:注解保留策略,三种取值:SOURCE、ClASS、RUNTIME,分别对应java源文件 — class文件 — 内存中的字节码。默认值为CLASS

—- ElementType:程序元素类型,有PACKAGE、TYPE、ANNOTATION_TYPE、FIELD、CONSTRUCTOR、METHOD等取值。默认值为任何元素

:@Override、@SuppressWarnings的Retention注解的属性值为SOURCE,@Deprecated的Retention注解的属性值为RUNTIME。

② 为注解增加各种属性

第二个例子:在上个例子中的MyAnnotation中增加color()方法。如下:

@Retention(RetentionPolicy.RUNTIME)  //元注解
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface MyAnnotation {
	String color();
}

则color为注解@MyAnnotation中的属性,返回值类型String为属性的类型,在AnnotationTest中使用该注解时需要为color赋值:

@MyAnnotation(color="red")

在程序中通过反射获得MyAnnotation的对象annotation时,取annotation的属性值时要按照方法调用来:


System.out.println(annotation.color());

注意:

1、此例中使用MyAnnotation时必须要为color属性指定值,如果在定义MyAnnotation时为color指定了默认值:String color() default “black”;

则使用MyAnnotation时可以不用为color赋值。

2、若只有一个属性名为value的属性需要赋值,则为value属性赋值时可以不用指定属性名。如:@Suppresswarnings(“deprecation”)

注解的属性类型可以是上面的String类型以及java预定义类型,还可以为以下高级类型:

1、数组类型的属性:

|— int[] arrAttr() default {1,2,3};

|— @MyAnnotation(arrAttr={8,6,4})

|— 如果数组属性中只有一个元素,这时候属性值部分可以省略大括号

2、枚举类型的属性:

|— TrafficLamp lamp() default TrafficLamp.RED;

|— @MyAnnotation(lamp=TrafficLamp.GREEN)

3、注解类型的属性:

|— MetaAnnotation annotationAttr() default @MetaAnnotation(“CQU”);

|— @MyAnnotation(annotationAttr=@MetaAnnotation(“PKQ”));

|— System.out.println(annotation.annotationAttr().value());

注:此例中,可以认为@MetaAnnotation是MetaAnnotation类的一个实例。


留下一个回复

你的email不会被公开。