java.lang.annotation 注解 包分析 自定义annotation

来源:互联网 发布:waves gtr for mac 编辑:程序博客网 时间:2024/06/05 14:18

如果说包、类型、域、方法、参数等是JAVA语言的基本元素与封装结构,处于描述级别,是对语言的描述
那么模块、子系统、系统等就是基本结构的现实体现,处于展现级别。
而注解是对JAVA语言的基本元素与封装结构进行描述,则可命名为元描述。
注解是JAVA语言的元语言,结合反射机制,可为JAVA提供运行时灵活性。
在实现自定义注解时,不需要显示的实现注解接口,这是编译器的事。
你必须做的只有一件事情:使用元注解@Target指定自定义注解的一个或多个作用域。


定义所有注解都实现的接口。

注意事项:接口本身不是注解,同时任何接口也不能简单的继承该接口。

只有编译器可以创建适当的接口类型。

public interface Annotation{

返回注解类型

Class<? extends Annotation> annotationType();


注解实例间,根据如下规则,进行等价比较:

1 2个对象是相同注解的成员,同时,所有对应的成员值都相等。

2 简单类型的等价性是由对应的包装类决定。这个原则同样适用于等价操作符==(适用==是更加高效率的),

  除了浮点数和双精度数(因为NaN==NaN)。

3 两个数组元素值x,y的等价性由对用的帮助函数equals(x, y){@link java.util.Arrays}决定。

4 通过调用equals()成员函数,决定其它成员值的哈希码。  (有待考究)

boolean equals(Object obj);


返回该注解的哈希码,哈希码通过以下规则决定:

1 注解的哈希码是注解成员的哈希码的和;

2 注解成员的哈希码通过如下公式计算:

(0x7f * n.hashCode()) ^ v.hashCode()),其中n是成员的名称,v是成员的值。

3 简单成员值的哈希码,由对应的包装类决定。

4 数组成员值的哈希码,是由对应的帮助类java.util.Arrays的成员函数hashCode(v)决定。

5 所有其它成员值的哈希码,是通过调用其成员函数hashCode决定。

int hashCode();

    

返回注解的字符串表示。对于返回什么字符内容,并没有强制的定义。

通常返回的内容遵循如下习惯:

1 返回注解的名称,并且在前面附件上@符号。

2 如果注解包括域成员,包含域的名称和值在返回串中。

String toString();

}


表示在类的二进制表现中的注解,存在句法错误,且注解解析器不能处理它。

如果是用通用的JAVA编译器编译的,该错误根本不会出现。

public class AnnotationFormatErrorextends Error


表示编译或是序列化后,注解的类型改变了

public class AnnotationTypeMismatchExceptionextends RuntimeException

表示在编译或是序列化后,向注解中添加了新的元素,并访问了该新元素。访问有默认值得新元素,该异常不会被抛出。

public class IncompleteAnnotationExceptionextends RuntimeException


定义注解保留策略,与Retention配合使用,以决定注解在整个开发周期中的生存时间

public enum RetentionPolicy {

    SOURCE,源码中保留的注解,在编译时候移除,不写入字节码

    CLASS,默认的注解,在源码和类文件中都保留的注解,在加载类时移除。可做字节码级别的预处理。

    RUNTIME 在源码、类文件、运行时都存在的注解,经常运用于反射中。

}

定义java程序元素类型,与Target元注解配合使用,以便限定在每些程序元素上使用某注解

public enumElementType {

    TYPE,类、接口、或是枚举声明

    FIELD,域声明

    METHOD,方法声明

    PARAMETER,

    CONSTRUCTOR,

    LOCAL_VARIABLE,

    ANNOTATION_TYPE,

    PACKAGE

}


定义元注解,决定注解的保留范围。如果保留注解没有设定,则默认使用类级保留策略。

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)

public @interface Retention {

    RetentionPolicy value();

}

定义元注解,决定该注解可以应用于什么元素类型(ElementType

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)

public @interface Target {

    ElementType[] value();

}

定义元注解,指示某注解被文档化并且被认为是公有API的一部分。

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)

public @interface Documented {

}


定义元数据,指示某个注解被自动继承

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)

public @interface Inherited {

}

使用方式:在定义新的注解时,在其最顶上加上@Inherited,
如在类或接口A的定义中使用了,则在其子类或是实现中,该注解是可用的。
否则,注解子只在当前类或是接口上是可用的。

上面是注解的基础,如何自定义注释请查看:

http://blog.csdn.net/lifetragedy/article/details/7394910



0 0
原创粉丝点击