Annotation 标注(注解)

来源:互联网 发布:域名分级 编辑:程序博客网 时间:2024/06/05 08:24
JDK1.5最引人关注的新功能。
对现代编程产生深远影响.

从JDK1.5开始增加了对元数据(MetaData) 的支持,提供名为Annotation(注解)的功能。它被定义为JSR-175规范,标准。

注解是以“@注释名”在代码中存在的,还可以添加一些参数值。

注释可以附加在package, class, method, field等上面,相当于给它们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问。如果没有外部解析工具等对其加以解析和处理的情况,本身不会对Java的源代码或class文件等产生任何影响,也不会对它们的执行产生任何影响。

元数据的作用,大致可分为三种:
编写文档,通过代码里标识的元数据生成文档;
代码分析,通过代码里标识的元数据对代码进行分析;
编译检查,通过代码里标识的元数据让编译器能实现基本的编译检查。

介绍JDK1.5内在的常用注释。
@Override  限定重写父类方法;
@Deprecated 用于表示程序元素(类, 方法)已过时;
@SuppressWarnings 抑制编译器警告。

Annotation 其实就是代码里的特殊标记, 它用于替代配置文件,也就是说,传统方式通过配置文件告诉类如何运行,有了注解技术后,开发人员可以通过注解告诉类如何运行在Java技术里注解的典型应用是可以通过反射技术去得到类里面的注解,以决定怎么去运行类。

掌握注解技术的要点:
如何自定义注解
如何反射注解,并根据反射的注解信息,决定如何去运行类

自定义Annotation

在interface关键字前面使用“@”符号声明Annotation类型
声明注解的属性
注解属性的作用:原来写在配置文件中的信息,可以通过注解的属性进行描述。
Annotation 的属性声明方式:String name()或String[] likes();
属性默认值声明方式:String name() default “xxx”;
特殊属性value:如果注解中有一个名称value的属性,那么使用注解时可以省略value=部分,如@MyAnnotation(“xxx")
特殊属性value[];

在interface关键字前面使用“@”符号声明Annotation类型。
元 Annotation指修饰Annotation的Annotation。JDK中定义了如下元Annotation(元 Annotation指修饰Annotation的Annotation):
@Retention: 只能用于修饰一个 Annotation 定义, 用于指定该 Annotation 可以保留的域, @Rentention 包含一个 RetentionPolicy 类型的成员变量, 通过这个变量指定域。
RetentionPolicy.CLASS: 编译器将把注解记录在 class 文件中. 当运行 Java 程序时, JVM 不会保留注解. 这是默认值。
RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注解. 程序可以通过反射获取该注释。
RetentionPolicy.SOURCE: 编译器直接丢弃这种策略的注释。

@Target:
指定注解用于修饰类的哪个成员. @Target 包含了一个名为 value,类型为ElementType(JDK6)的成员变量。
ElementType.ANNOTATION_TYPE: 应用于注释类型声明
ElementType.CONSTRUCTOR: 构造方法声明
ElementType.FIELD: 应用于字段声明(包括枚举常量)
ElementType.LOCAL_VARIABLE: 应用于局部变量声明
ElementType.METHOD: 应用于方法声明
ElementType.PACKAGE: 应用于包声明
ElementType.PARAMETER: 应用于参数声明
ElementType.TYPE:应用于类、接口(包括注释类型)或枚举声明
@Documented: 用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档。
@Inherited: 被它修饰的 Annotation 将具有继承性.如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注解。

代码示例:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
//译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注解. 程序可以通过反射获取该注释
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
       
      long timeout();
}


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value=ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ClassDesc {
    //声明属性   需要加上括号  属性不能是私有的
     String value();  
}


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(value=ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldDesc {

    String value();

}


import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

//指定该注解有效时间
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoMapper {
   
    boolean required() default true;
}