java用public @interface Annotation
{
} 定义一个注解 @Annotation
@Override @Deprecated @SuppressWarnings为常见的3个注解,注解@Retention可以用来修饰注解。
Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolicy是一个枚举类型,这个枚举决定了Retention注解应该如何去保持,也可理解为Rentention 搭配 RententionPolicy使用。
RetentionPolicy有3个值:CLASS RUNTIME SOURCE
用@Retention(RetentionPolicy.CLASS)修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候;
用@Retention(RetentionPolicy.SOURCE )修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中;
用@Retention(RetentionPolicy.RUNTIME )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时,所以他们可以用反射的方式读取。RetentionPolicy.RUNTIME 可以让你从JVM中读取Annotation注解的信息,以便在分析程序的时候使用.
举个例子:定义一个注解@MyAnnotation,用@Retention注解修饰,属性为(RetentionPolicy.RUNTIME )
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation
{
}
定义一个类MyTest, @MyAnnotation注解修饰output方法
public class MyTest
{
@MyAnnotation
public void output()
{
System.out.println("exists Annotation");
}
}
下面用反射来判断注解是否调用output()方法:
public static void main(String[] args) throws Exception
{
MyTest myTest = new MyTest();
Class<MyTest> c = MyTest.class;
Method method = c.getMethod("output", new Class[] {});
if (method.isAnnotationPresent(MyAnnotation.class))
//// 如果@MyAnnotation 注解 在 output 方法上面的话 则if 返回 TURE
{
method.invoke(myTest, new Object[] {});
}
else
System.out.println("no Annotation");
}
所以上面程序打印:exists Annotation
如果Retention 修饰@MyAnnotation 为
@Retention(RetentionPolicy.CLASS)或RetentionPolicy.SOURCE,程序打印no Annotation
以上为注解属性在程序中应用的一个例子,注解@Target还用来限定Annotation的使用对象,它有一个属性ElementType也是枚举类型,值为:ANNOTATION_TYPE CONSTRUCTOR FIELD LOCAL_VARIABLE METHOD PACKAGE PARAMETER
TYPE
如@Target(ElementType.METHOD) 修饰的注解表示该注解只能用来修饰在方法上。
注解大都用来在开发框架中吧,我也不太清楚,听老师说的0-0…… Junit4 测试框架就是基于注解实现的吧,如在Junit4 中这样写:
public class MyTest
{
@Test
public void hello()
{
System.out.println("w kao ha ha");
}
}
程序就可以直接运行,应该是基于注解加反射实现的…………
以上是我学习的总结,希望对大家有帮助啊…………
|