-------android培训、java培训、期待与您交流! ----------
1.Annotation的概念
Annotation(注解,也称之为注释),是一种从JDK5开始,Java增加额对元数据(MeteData)的支持。注解,其实是代码里的一种特殊标记。通过使用注解,程序开发人员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充的信息。代码分析工具、开发工具和部署工具通过这些补充信息进行验证或部署。注解可以标记加在包、类、构造器、方法、成员变量、参数、局部变量、代码块等的声明,这些信息被存储在注解的“name=value”对中。Annotation是一个接口,可以通过反射来获取指定程序元素的Annotation对象,然后通过Annotation对象来取得注解里的元素。
2.基本Annotation
Java中java.lang包有4种基本的Annotation:
(1)@Override 用来指定方法覆盖的,可以强制一个子类必须覆盖父类的方法;
(2)@Deprecated 用于表示某个程序元素(类、方法等)已过时,当其他程序使用已过时的类、方法时,编译器或给出警告 ;
(3)@SuppressWarnings 指示被该Annotation修饰的程序元素(及里面的子元素)取消显示指定的编译警告;
(4)@SafeVarargs 这是Java 7新增的基本注解,用于抑制“堆污染”警告(不作详细说明了)。
3.Meta Annotation(元注解)
java.lang.annotation包中有4个Meta Annotation(元注解),用于修饰其他的Annotation。
(1)@Retention 用于指定被修饰的Annotation可以保留多长时间(即注解的生命周期),包含一个RetentionPolicy类型的value成员变量,使用时必须为该value指定值。
value成员变量只能是下面3个:
1)RetentionPolicy.CLASS:编译器将把Annotation记录在class文件中,当运行Java程序时,JVM不再保留Annotation。这是默认值。
2)RetentionPolicy.RUNTIME:编译器将把Annotation记录在class文件中,当运行Java程序时,JVM也会保留Annotation,程序可以通过反射获取该Annotation信息。
3)RetentionPolicy.SOURCE:Annotation只保留在源代码中,编译器直接丢弃这种Annotation。
(2)@Target 用于指定被修饰的Annotation能用于哪些程序单元,里面也有一个value成员变量,主要有ElementType.TYPE(指定可以修饰类、接口、枚举
等)、 ElementType.METHOD(指定只能修饰方法定义)等等,其余可以在API中ElementType枚举中查到。
(3)@Docmented 用于指定被修饰的Annotation类将被javadoc工具提取成API文档
(4)@Inherited 用于指定被修饰的Annotation将具有继承性,即被@Inherited修饰的注解所修饰的类的子类也会被@Inherited修饰。
4.Annotation的属性
注解内的属性(即value值)类型有:8个基本类型、String类、Class类型、枚举、注解、以及前面所有类型的数组。
下面是自定义的一个注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import Enum.EnumTest1; //自定义的枚举所在的包
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface MyAnnotation1 {
String color();//属性为字符串
int[] arr();//属性为int数组
String[] str();//属性为字符串数组
EnumTest1.TrafficLamp lamp() default EnumTest1.TrafficLamp.YELLOW ; //属性为一个自定义对的枚举
Class<?> c() default int.class;//属性为Class类
}
5.使用Annotation
下面是用来测试Annotation的程序
import Enum.EnumTest1;
@MyAnnotation1(color="yellow",arr={1,2,3,4},str="a",lamp=EnumTest1.TrafficLamp.RED,c=double.class)//数组只有1个元素,可以省略{}
public class AnnotationTest {
public static void main(String[] args) {
getV();//该方法已被注解为过时方法
if(AnnotationTest.class.isAnnotationPresent(MyAnnotation1.class)){ //用isAnnotationPresent(Class<? extends Annotation>)判断该程序元素上是否存在指定类型的注解
MyAnnotation1 a = AnnotationTest.class.getAnnotation(MyAnnotation1.class);//用getAnnotation(Class<T>)方法返回该程序元素上存在指定类型的注解
System.out.println(a);//获取注解
System.out.println(a.color());//获取注解的属性
System.out.println(a.arr().length);
System.out.println(a.str().length);
System.out.println(a.lamp().nextLamp());
System.out.println(a.c().getName());
}
}
@Deprecated//过时注解
public static void getV(){
}
@Override //重写注解
public boolean equals(Object obj){
return false;
}
}