---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ---------------------
注解:一个注解就是一个类,列如,我们在使用一个方法时,有时候编译器会提示我们该方法已过时,我们不想让它提醒,就可以加个注解@SuppressWarnings(“deprecation”)
这就表示创建了一个SuppressWarnings类,”deprecation”表示传递给该类value方法的值(下面会讲到)
小结:注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无任何标记,看你有什么标记,就去干像样的事情,标记可以加在包,类,字段,方法的参数以及局部变量上。
我们现在根据这个结构来设计三个类
AnnotationA类 ,AnnotationB类,AnnotationC类
AnnotationA类
public @interface AnnotationA {
}
AnnotationB 类
@AnnotationA
public class AnnotationB {
}
AnnotationC 类
public class AnnotationC {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
if (AnnotationB.class.isAnnotationPresent(AnnotationA.class)) {
AnnotationA A = AnnotationB.class.getAnnotation(AnnotationA.class);
System.out.println(A);
}
}
}
但是控制台并没有任何反应,这说明,在AnnotationC类中,并没有执行if里面的语句,说明判断结果为fasle,为什么会发生这种情况呢?
修改AnnotationA类中的代码:
截图:
输出了想要的结果,那么这条代码到底是什么意识呢?
@Rentention()元注解有三种取值范围:
RententionPolicy.SOURCE: 对应java源文件
RententionPolicy.CLASS: 对应class文件(默认取值)
RententionPllicy.RUNTIME: 对应内存中的字节码
写到这里,我们再来看一下比较常用的三个注解类,其Rentention的取值分别是什么:
1、@Deprecated 其@Rentention的取值是RententionPolicy.RUNTIME
2、@SuppressWarnints(“deprecation”) RententionPolicy.SOURCE
3、@Override RententionPolicy.SOURCE
接下来我们来看Target元注解
1、@Target(ElementType.METHOD)括号中的参数本应是一个数组,若只传入一个,可以简写,这个注解的目的是说明该注解只能加在方法上
2、@Target([ElementType.METHOD,ElementType.TYPE]) 既可以加在方法上,也可以加在类上(TYPE是class,interface,enum的父接口)
还可以为注解增加属性:
列如:1、在注解类AnnotationA类中增加属性(方法):String color();
2、在AnnotationB上标记 @AnnotationA(color=“red”)
3、在AnnotationC中 AnnotationA A=(AnnotationA)AnnotationB.class.getAnnotation(Annotation.class);
System.out.println(AnnotationA.color());
另外,还可以为属性指定缺省值:
String color() default “yellow”;
Value属性
String value() default “zxx”;
如果注解中只有一个value属性,可以简写 @AnnotationA(“abc”)
数组类型的属性:
Int[] arrayAttr() default {1,2,3};
@AnnotationA(arrayAttr(2,3,4)),如果数组属性中只有一个元素,这时候属性值部分可以省略大括号,eg: @AnnotationA(arrayAttr=2)
枚举类型的属性:
(需要用到前面定义的交通灯)
EnumTest.TrafficLamp lamp();
@AnnotationA(lamp=EnumTest.TrafficLamp.GREEN)
注解类型的属性:
列如我们再定义一个注解类型MetaAnnotation
MetaAnnotation annotationAttr() default @MetaAnnotation(“xxx”);
@AnnotationA(annotationAttr=@MetaAnnotation(“yyy”))
测试:
AnnotationA类
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationA {
AnnotationD annotationAttr() default @AnnotationD("xyz");
}
AnnotationC 类
AnnotationA A=AnnotationB.class.getAnnotation(AnnotationA.class);
System.out.println(A.annotationAttr());
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ---------------------