注解(annotation)概述:
·从JDK5.0 开始,java增加了对元数据(MetaData)的支持,也就是Annotation(注解)
·Annotation其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。
·Annotation可以像修饰符一样被使用,可用于修饰包,类,构造器,方法,成员变量,参数,局部变量的声明,这些信息被保存在Annotation的“name=value”对中。
·Annotation能被用来为程序元素(类,方法,成员变量等)设置元数据
基本的Annotation:
·使用Annotation时要在其前面增加@符号,并把该Annotation当成一个修饰符使用。用于修饰它支持的程序元素
·三个基本的Annotation:
[email protected] Override:限定重写父类方法,该注释只能用于方法
[email protected] Deprecated:用于表示某个程序元素(类,方法等)已过时
[email protected] SuppressWarnings:抑制编译器警告
自定义Annotation:
·定义新的Annotation类型使用@interface关键字
·Annotation的成员变量在Annotation定义中以无参数方法的形式来声明。其方法名和返回值定义了该成员的名字和类型。
·可以在定义Annotation的成员变量时为其制定初始值,指定成员变量的初始值可使用default关键字
例:
public @interface MyAnnotation{
String name() default "liang"
}
·没有成员定义的Annotation称为标记;包含成员变量的Annotation称为元数据Annotation
提取Annotation信息:
·JDK5.0 在java.lang.reflect 包下新增了AnnotationElement接口,该接口代表程序中可以接受注解的程序元素
·当一个Annotation类型被定义为运行时可见,当class文件被载入时保存在class文件中的Annotation才会被虚拟机读取
·程序可以调用AnnotationElement对象的如下方法来访问Annotation信息
JDK的元Annotation:
·JDK的元Annotation用于修饰其他Annotation定义
·JDK5.0 提供了专门在注解上的注解类型,分别是:
1.Retention
2.Target
3.Documented
4.Inherited
·@Retention:只用用于修饰一个Annotation定义,用于指定该Annotation可以保留多长时间,@Retention包含一个RetentionPolicy类型的成员变量,使用@Retention时必须为该value成员变量指定值:
1.RetentionPolicy.SOURCE:编译器直接直接丢弃这种策略的注释
2.RetentionPolicy.CLASS(默认):编译器会把注释记录在class文件中。当运行java程序时,JVM不会保留注解。这是 默认值
3.RetentionPolicy.RUNTIME:编译器将把注释记录在class文件中。当运行java程序时,JVM会保留注释。程序可以通过反射获取该注释。
·@Target:用于修饰Annotation定义,用于指定被修饰的Annotation能用于哪些程序元素。@Target也包含了一个名为value的成员变量。
@Documented:用于指定被该元Annotation修饰的Annotation类江北javadoc工具提取成文档。
1.定义为Documented的注解必须设置Retention值为RUNTIME。
·@Inherited:被它修饰的Annotation将具有继承性。如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解(实际应用中,使用较少)。
1 package com.demo; 2 /* 3 * 4 * 如何自定义一个注解 5 * 元注解 6 */ 7 public class TestAnnotation { 8 public static void main(String[] args) { 9 Person p = new Student(); 10 p.walk(); 11 } 12 } 13 14 class Student extends Person{ 15 16 @Override 17 public void walk() { 18 System.out.println("学生走路"); 19 } 20 @Override 21 public void eat() { 22 super.eat(); 23 } 24 } 25 class Person{ 26 @MyAnnotation(value="liang") 27 String name; 28 int age; 29 30 public Person() { 31 } 32 public Person(String name, int age) { 33 super(); 34 this.name = name; 35 this.age = age; 36 } 37 public void walk(){ 38 System.out.println("走路"); 39 } 40 @Deprecated 41 public void eat(){ 42 System.out.println("吃东西 "); 43 } 44 @Override 45 public String toString() { 46 return super.toString(); 47 } 48 49 }
1 package com.demo; 2 3 import java.lang.annotation.Retention; 4 import java.lang.annotation.RetentionPolicy; 5 import java.lang.annotation.Target; 6 import java.lang.reflect.Field; 7 import java.lang.annotation.ElementType; 8 //自定义的注解 9 @Target({ElementType.FIELD}) 10 @Retention(RetentionPolicy.RUNTIME) 11 public @interface MyAnnotation { 12 String value() default "Hello"; 13 }