一.注解概念: 注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
了解一下java1.5起默认的三个annotation类型:
一个是@Override:只能用在方法之上的,用来告诉别人这一个方法是改写父类的。
一个是@Deprecated:建议别人不要使用旧的API的时候用的,编译的时候会用产生警告信息,可以设定在程序里的所有的元素上.
一个是@SuppressWarnings:这一个类型可以来暂时把一些警告信息消息关闭.
二、通过反射查看其它类中的注释:
第一、注解类:@interfaceA{}
第二、应用了“注释类”的类:@Aclass B{}
第三、对“应用注释类的类”进行反射操作的类:class{...},操作如下:
B.class.isAnnotionPresent(A.class);//判断是否存在此注解类
A a = B.class.getAnnotation(a.class);//存在的话则得到这个注释类的对象
示例
- @Retention(RetentionPolicy.RUNTIME)
- @Target({ElementType.TYPE,ElementType.METHOD})
- public @interface ItcastAnnotation {}
- @ItcastAnnotation()
- public class AnnotionTest {
- @SuppressWarnings("deprecation")//表示压制警告的注解
- @ItcastAnnotation()
- public static void main(String[] args) {
- System.runFinalizersOnExit(true);
- //反射方式查看注解
- //检查类上是否有注解
- if(AnnotionTest.class.isAnnotationPresent(ItcastAnnotation.class)){
- //通过反射获取到注解
- ItcastAnnotation annotation =
- AnnotionTest.class.getAnnotation(ItcastAnnotation.class);
- System.out.println(annotation);
- }
- }
- }
三、为注解增加基本属性
1、属性
一个注解相当于一个胸牌,但仅通过胸牌还不足以区别带胸牌的两个人,这时就需要给胸牌增加一个属性来区分,如颜色等。
2、定义格式
同接口中的方法一样:String color();
定义缺省格式:Stringvalue() default ”ignal”;
3、应用
直接在注解的括号中添加自身的属性,如:
@ItcastAnnotation(color=”red”)
这个和上面的@SuppressWarnings("deprecation")是一样的,其中的"deprecation"就是属性值
◇当只有一个属性时,可直接传入属性值。如”red”
◇当含有其他属性值的时候,如果那个属性值是缺省的(default),也可以直接传入这个属性值。
四、为注解增加高级属性
1、可以为注解增加的高级属性的返回值类型有:
◇八种基本数据类型
◇String类型
◇Class类型
◇枚举类型
◇注解类型
◇前五种类型的数组
2、数组类型的属性
定义:int[]arrayArr() default {1,2,3}; --> 可不定义默认值
应用:@MyAnnotation(arrayArr={2,3,4}) --> 可重新赋值
注:若数组属性中只有一个元素(或重新赋值为一个元素),这时属性值部分可省略大括号。
3、枚举类型的属性
假设定义了一个枚举类TraffLamp,它是EnumTest的内部类,其值是交通灯的三色。
定义:EnumTest.TrafficLamplamp();
应用:@MyAnnotation(lamp=EnumTestTrafficLamp.GREEN)
4、注解类型的属性
假定有个注解类:MetaAnnotation,其中定义了一个属性:String value()
定义:MetaAnnotationannotation() default @MetaAnnotation(”xxx”);
应用:@MyAnnotation(annotation=@MetaAnnotation(”yyy”)) --> 可重新赋值
可认为上面的@MetaAnnotation是MyAnnotation类的一个实例对象,
同样可以认为上面的@MetaAnnotation是MetaAnnotation类的一个实例对象,
调用:
MetaAnnotation ma =MyAnnotation.annotation();
System.out.println(ma.value());
5、Class类型的属性:
定义:Class cls();
应用:@MyAnnotation(cls=ItcastAnnotion.class)
注:这里的.class必须是已定义的类,或是已有的字节码对象
6、基本数据类型的属性(以int为例)
定义:int val()default 3; -->可不定义默认值
应用:@MyAnnotation(val=7) --> 可重新赋值