Annotation
JDK1.5之后,引入了元数据的概念,也就是Annotation(注释),其实它是代码里的特殊标记,这些标记可以再编译、类加载、运行时被读取,并执行相应的处理。
元数据的作用:
如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类:
1. 编写文档:通过代码里标识的元数据生成文档。
2. 代码分析:通过代码里标识的元数据对代码进行分析。
3. 编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查。
java 基本注解:
这里有四种类型的元注解:
四种类型元注解 | 说明 |
---|---|
@Documented | 指明拥有这个注解的元素可以被javadoc此类的工具文档化。这种类型应该用于注解那些影响客户使用带注释的元素声明的类型。如果一种声明使用Documented进行注解,这种类型的注解被作为被标注的程序成员的公共API。 |
@Target | 指明该类型的注解可以注解的程序元素的范围。该元注解的取值可以为TYPE,METHOD,CONSTRUCTOR,FIELD等。如果Target元注解没有出现,那么定义的注解可以应用于程序的任何元素。 |
@Inherited | 指明该注解类型被自动继承。如果用户在当前类中查询这个元注解类型并且当前类的声明中不包含这个元注解类型,那么也将自动查询当前类的父类是否存在Inherited元注解,这个动作将被重复执行知道这个标注类型被找到,或者是查询到顶层的父类。 |
@Retention | 指明了该Annotation被保留的时间长短。RetentionPolicy取值为SOURCE,CLASS,RUNTIME。 |
三种内建注解
三种内建注解 | 说明 |
---|---|
@Override | 当我们想要复写父类中的方法时,我们需要使用该注解去告知编译器我们想要复写这个方法。这样一来当父类中的方法移除或者发生更改时编译器将提示错误信息。 |
@Deprecated | 当我们希望编译器知道某一方法不建议使用时,我们应该使用这个注解。Java在javadoc 中推荐使用该注解,我们应该提供为什么该方法不推荐使用以及替代的方法。 |
@SuppressWarnings | 这个仅仅是告诉编译器忽略特定的警告信息,例如在泛型中使用原生数据类型。它的保留策略是SOURCE(译者注:在源文件中有效)并且被编译器丢弃。 |
使用注解的简单例子:
@Deprecated
@SuppressWarnings("")
public class Test implements Test1{
@Override
public void method1() {
}
}
在反射应用中,Class、 Method 类有许多方式可以获得注解,在此就不一一列举了。只介绍Class 类提供一个方法取得类的所有注解:getAnnotations()
public static void main(String[] args) {
Annotation[] annotations = Test.class.getAnnotations();
for (Annotation annotation: annotations) {
System.out.println(annotation);
}
}
注意运行结果如下:
结果是获得了注解,但遗憾的是只获得一个注解。因为这是由Annotation的使用策略决定的,这个例子中只有@Deprecated 一直到运行时有效。如果想知道Annotation 的运行级别有哪些,可以参看java.lang.annotation 包中的一个枚举类:RetentionPolicy
package java.lang.annotation;
/**
* 注解保留策略. 这个枚举类型的常量描述了保留注释的各种策略。 它们与元注释类型一起使用,以指定要保留注释的时间
*/
public enum RetentionPolicy {
// 源代码之中
SOURCE,
// 类文件之中。
// 这是默认。
CLASS,
// 运行期间。
RUNTIME
}
自定义注解
上面已经介绍完java 注解的一些基本知识,现在我们就可以自己定义属于自己的注解类了。
自定义注解的写法如下
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* Created by ShayneLee on 2017/11/19
* // 定义自己的MyAnnotiation 此注解在运行期有效
*/
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
public String name() default "sisi"; // 定义name 属性 默认是sisi
public String value();
}
写好后就可以使用注解了。
import java.lang.annotation.Annotation;
/**
* Created by ShayneLee on 2017/11/19
*/
@MyAnnotation(value = "happy") // 使用自定义注解
public class AnnotationTest {
public static void main(String[] args) {
MyAnnotation ma = AnnotationTest.class.getAnnotation(MyAnnotation.class);
System.out.println(ma.name() +": "+ ma.value());
}
}
结果如下:
sisi: happy