注解相当于一种标记,加了注解就等于打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事,标记可以加在包,类,字段,方法,方法的参数以局部变量上。
定义一个最简单的注解:public @interface MyAnnotation{ }
把它加在某个类上:@MyAnnotation public class AnnotationTest{ }
用反射进行测试AnnotationTest的定义上是否有@MyAnnotation
@Retention元注解的讲解,其三种取值:
RetetionPolicy.SOURCE java源文件
RetetionPolicy.CLASS class文件
RetetionPolicy.RUNTIME 内存中的字节码
定义一个最简单的注解:public @interface MyAnnotation{ }
把它加在某个类上:@MyAnnotation public class AnnotationTest{ }
用反射进行测试AnnotationTest的定义上是否有@MyAnnotation
@Retention元注解的讲解,其三种取值:
RetetionPolicy.SOURCE java源文件
RetetionPolicy.CLASS class文件
RetetionPolicy.RUNTIME 内存中的字节码
@Target
A.定义基本类型的属性和应用属性
在注解类中增加
String color(); //可以设置默认String color() default "yellow";
String value(); //可以设置默认String value() default "abc ";
数组类型int [ ] arrayAttr(); // //可以设置默认 int [ ] arrayAttr() default{1,2,3} ;
枚举类型 EnumTest.TrafficLamp lamp();
@Deprecated
@Retention ( value = RUNTIME ) //值的生命周期
@Target ( value ={ CONSTRUCTOR , FIELD , LOCAL_VARIABLE , METHOD , PACKAGE , PARAMETER , TYPE }) //适用范围
@Retention ( value = RUNTIME ) //值的生命周期
@Target ( value ={ CONSTRUCTOR , FIELD , LOCAL_VARIABLE , METHOD , PACKAGE , PARAMETER , TYPE }) //适用范围
@Override
@Retention ( value = SOURCE )
@Target ( value = METHOD )
@SuppressWarnings
@Retention ( value = SOURCE )
@Target ( value ={ TYPE , FIELD , METHOD , PARAMETER , CONSTRUCTOR , LOCAL_VARIABLE })
为注解增加基本属性@Retention ( value = SOURCE )
@Target ( value = METHOD )
@SuppressWarnings
@Retention ( value = SOURCE )
@Target ( value ={ TYPE , FIELD , METHOD , PARAMETER , CONSTRUCTOR , LOCAL_VARIABLE })
A.定义基本类型的属性和应用属性
在注解类中增加
String color(); //可以设置默认String color() default "yellow";
String value(); //可以设置默认String value() default "abc ";
数组类型int [ ] arrayAttr(); // //可以设置默认 int [ ] arrayAttr() default{1,2,3} ;
枚举类型 EnumTest.TrafficLamp lamp();
注解类型MetaAnnotation annotationAttr();
//
可以设置默认
@
MetaAnnotation
("xxxx")
;
使用:@MyAnnotation(color="red")
@ MyAnnotation (value="abc")
@MyAnnotation(arrayAttr={2,3,4})
@MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)
@MyAnnotation(annotationAttr=@MetaAnnotation("yyy"))
可以认为@ MyAnnotation是 MyAnnotation类的实例对象,同样可认为 @MetaAnnotation 是 MetaAnnotation类的一个实例对象
用反射方式获取得注解对应的实例对象后,再能过该对象调用属性对应的方法
MyAnnotation annotation=(MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
代码:
@interface MetaAnnotation {
@ MyAnnotation (value="abc")
@MyAnnotation(arrayAttr={2,3,4})
@MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)
@MyAnnotation(annotationAttr=@MetaAnnotation("yyy"))
可以认为@ MyAnnotation是 MyAnnotation类的实例对象,同样可认为 @MetaAnnotation 是 MetaAnnotation类的一个实例对象
用反射方式获取得注解对应的实例对象后,再能过该对象调用属性对应的方法
MyAnnotation annotation=(MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
代码:
@interface MetaAnnotation {
String value();
}
@Retention(RetentionPolicy.RUNTIME)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
@interface ItcastAnnotation {
String color();//注解添加属性
String value();
int[] arrayAttr();
//EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;
MetaAnnotation annotationAttr()default@MetaAnnotation("kkk");
}
@ItcastAnnotation(color="red",value="abc",arrayAttr={1,2},annotationAttr=@MetaAnnotation("flx"))
public class AnnotationTest {
@SuppressWarnings("deprecaion")
//@ItcastAnnotation("abc")只有一个值时,可简写
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
System.runFinalizersOnExit(true);
//sayHello();
if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class))
{
ItcastAnnotation annotation=(ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
System.out.println(annotation.color());
System.out.println(annotation.value());
System.out.println(annotation.arrayAttr().length);
//System.out.println(annotation.lamp().nextLamp().name());
System.out.println(annotation.annotationAttr().value());
}
}
}