java注解Annotation

来源:互联网 发布:卓越物业软件 编辑:程序博客网 时间:2024/05/16 17:50
Java Annotation是JDK5.0引入的一种注释机制

1.annotation组成成分
java annotation 的组成中,有3个非常重要的主干类。它们分别是:
(01) Annotation.java
package java.lang.annotation;
public interface Annotation {

boolean equals(Object obj);

int hashCode();

String toString();

Class<? extends Annotation> annotationType();
}
(02) ElementType.java
package java.lang.annotation;

public enum ElementType {
TYPE, /* 类、接口(包括注释类型)或枚举声明 */

FIELD, /* 字段声明(包括枚举常量) */

METHOD, /* 方法声明 */

PARAMETER, /* 参数声明 */

CONSTRUCTOR, /* 构造方法声明 */

LOCAL_VARIABLE, /* 局部变量声明 */

ANNOTATION_TYPE, /* 注释类型声明 */

PACKAGE /* 包声明 */
}
(03) RetentionPolicy.java
package java.lang.annotation;
public enum RetentionPolicy {
SOURCE, /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了 */

CLASS, /* 编译器将Annotation存储于类对应的.class文件中。默认行为 */

RUNTIME /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */
}

2. java自带的Annotation
1 Annotation通用定义
(01) @interface -- 使用@interface定义注解时,意味着它实现了java.lang.annotation.Annotation接口,即该注解就是一个Annotation。
       定义Annotation时,@interface是必须的。
(02) @Documented -- 它的作用是说明该注解能出现在javadoc中。
(03) @Retention(RetentionPolicy.RUNTIME) -- 它的作用是指定Inherited的策略是RetentionPolicy.RUNTIME。这就意味着,编译器会将Inherited的信息保留在.class文件中,并且能被虚拟机读取。

(04) @Target(ElementType.ANNOTATION_TYPE) -- 它的作用是指定Inherited的类型是ANNOTATION_TYPE。这就意味着,@Inherited只能被用来标注“Annotation类型”。其类型包括
(TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE)
TYPE意味着,它能标注“类、接口(包括注释类型)或枚举声明”。
       FIELD意味着,它能标注“字段声明”。
       METHOD意味着,它能标注“方法”。
       PARAMETER意味着,它能标注“参数”。
       CONSTRUCTOR意味着,它能标注“构造方法”。
       LOCAL_VARIABLE意味着,它能标注“局部变量”。
(05) @Inherited 的含义是,它所标注的Annotation将具有继承性。
2 Java自带Annotation
@Deprecated -- @Deprecated 所标注内容,不再被建议使用。@Override-- @Override 只能标注方法,表示该方法覆盖父类中的方法。@Documented-- @Documented 所标注内容,可以出现在javadoc中。@Inherited-- @Inherited只能被用来标注“Annotation类型”,它所标注的Annotation具有继承性。@Retention-- @Retention只能被用来标注“Annotation类型”,而且它被用来指定Annotation的RetentionPolicy属性。@Target-- @Target只能被用来标注“Annotation类型”,而且它被用来指定Annotation的ElementType属性。@SuppressWarnings-- @SuppressWarnings 所标注内容产生的警告,编译器会对这些警告保持静默。
补充:SuppressWarnings 常用的关键字的表格
deprecation -- 使用了不赞成使用的类或方法时的警告unchecked -- 执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型。fallthrough -- 当 Switch 程序块直接通往下一种情况而没有 Break 时的警告。path -- 在类路径、源文件路径等中有不存在的路径时的警告。serial -- 当在可序列化的类上缺少 serialVersionUID 定义时的警告。finally -- 任何 finally 子句不能正常完成时的警告。all -- 关于以上所有情况的警告。
3 注解元素
– 注解元素可用的类型如下:
– 所有基本类型(int,float,boolean,byte,double,char,long,short)
– String
– Class
– enum
– Annotation
– 以上类型的数组
如果使用了其他类型,那编译器就会报错。也不允许使用任何包装类型。注解也可以作为元素的类型,也就是注解可以嵌套。
元素的修饰符,只能用public或default。
– 默认值限制
编译器对元素的默认值有些过分挑剔。首先,元素不能有不确定的值。也就是说,元素必须要么具有默认值,要么在使用注解时提供元素的值。
其次,对于非基本类型的元素,无论是在源代码中声明,还是在注解接口中定义默认值,都不能以null作为值。这就是限制,这就造成处理器很难表现一个元素的存在或缺失状态,因为每个注解的声明中,所有的元素都存在,并且都具有相应的值。为了绕开这个限制,只能定义一些特殊的值,例如空字符串或负数,表示某个元素不存在。
4 jdk8注解的加强
在JDK1.8中ElementType多了两个枚举成员,TYPE_PARAMETER和TYPE_USE,他们都是用来限定哪个类型可以进行注解

3.Annotation 的作用
Annotation 是一个辅助类,它在Junit、Struts、Spring等工具框架中被广泛使用。
我们在编程中经常会使用到的Annotation作用有:
1 编译检查
Annotation具有“让编译器进行编译检查的作用”。
例如,@SuppressWarnings, @Deprecated和@Override都具有编译检查作用。
(01) 关于@SuppressWarnings和@Deprecated
(02) 若某个方法被 @Override的 标注,则意味着该方法会覆盖父类中的同名方法。如果有方法被@Override标示,但父类中却没有“被@Override标注”的同名方法,则编译器会报错。
2 在反射中使用Annotation
在反射的Class, Method, Field等函数中,有许多于Annotation相关的接口。
这也意味着,我们可以在反射中解析并使用Annotation。
3 根据Annotation生成帮助文档
通过给Annotation注解加上@Documented标签,能使该Annotation标签出现在javadoc中。

4 能够帮忙查看查看代码
通过@Override, @Deprecated等,我们能很方便的了解程序的大致结构。
另外,我们也可以通过自定义Annotation来实现一些功能。