JDK1.5开始,Java增长了对元数据(即类的组成单元数据)的支持,也就是注解(Annotation),他是代码里作的特殊标记,这些标记能够在编译、类加载、运行时在不改变原有逻辑的状况下被读取,并执行相应的处理,经过使用Annotation,程序员能够在原文件中嵌入一些补充的信息。代码分析工具、开发工具和部署工具能够经过这些补充信息进行验证或者进行部署。Annotation相似于修饰符同样被使用,能够用于包、类、构造方法、方法、成员变量、参数、局部变量的声明。
java
注意:Annotation是个接口,程序能够经过反射来获取指定的程序元素的Anotation对象,而后经过Annotation对象来得到注解里面的元数据。Annotation有时是指java.lang.Annotation,有时指注解自己。程序员
在JDK1.5以后,在系统中提供了三个Annotation,分别是:@Override、@Deprecated、@SuppressWarningside
@Override工具
它的做用是对覆盖超类中方法的方法进行标记,若是被标记的方法并无实际覆盖超类中的方法,则编译器会发出错误警告。开发工具
@Deprecated测试
表示这一个类或方法已过期,再也不建议继续使用了。
spa
@SuppressWarningscode
表示关闭不当的编译器警告信息。
对象
其参数有:
接口
deprecation,使用了过期的类或方法时的警告
unchecked,执行了未检查的转换时的警告
fallthrough,当Switch程序块直接通往下一种状况而没有break时的警告
path,在类路径、源文件路径等中有不存在的路径时的警告
finally,任何finally子句不能正常完成时的警告
all,关于以上全部状况的警告
下面看一个小例子:
package com.main; public class Person { @Override public String toString() { return "测试@Override"; } @Deprecated public void print() { System.out.println("测试@Deprecated"); } }
注解应用须要三个步骤:
编写注释
在类上应用注释
对应用了注释的类进行反射操做的类
自定义Annotation的语法以下:
访问控制权限 @interface Annotation名称{}
例如:
public @interface MyAnnotation{}
package com.main; /** * 自定义注解 * @author lenovo */ public @interface MyAnnotation { // 定义变量 public String name(); public int age(); public String info() default "学生";// 为变量info设置默认值 }
package com.main; @MyAnnotation(age = 18, name = "小明") public class Person {
Annotation要想决定其做用的范围,能够经过@Retention指定,而Retention指定的范围由RetentionPolicy决定,RetentionPolicy指定了三种范围:
范围 | 描述 |
public static final RetentionPolicy SOURCE | 在java源程序中存在 |
public static final RetentionPolicy CLASS | 在java生成的class中存在 |
public static final RetentionPolicy RUNTIME | 在java运行的时候存在 |
示例:
package com.main; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * 自定义注解 * @author lenovo */ @Retention(value = RetentionPolicy.RUNTIME) public @interface MyAnnotation { // 定义变量 public String name(); public int age(); public String info() default "学生";// 为变量info设置默认值 }
一个Annotation真正起做用,必须结合反射机制,在反射中提供了如下的操做方法:
java.lang.reflect.AccessibleObject
方法名称 | 描述 |
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) | 判断是不是指定的Annotation |
public Annotation[] getAnnotations() |
获得所有的Annotation |
实例:
package com.main; import java.lang.annotation.Annotation; public class AnnotationTest { public static void main(String[] args) throws InstantiationException, IllegalAccessException { Class personClass = Person.class; Annotation annotation = personClass.getAnnotation(MyAnnotation.class); MyAnnotation myAnnotation = (MyAnnotation) annotation; String name = myAnnotation.name(); int age = myAnnotation.age(); Person p1 = (Person) personClass.newInstance(); p1.setName(name); p1.setAge(age); System.out.println(p1); } }