java.lang.annotation 引文 包分析 自定义annotation
如果说包、类型、域、方法、参数等是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 AnnotationFormatError extends Error
表示编译或是序列化后,注解的类型改变了
public class AnnotationTypeMismatchException extends RuntimeException
表示在编译或是序列化后,向注解中添加了新的元素,并访问了该新元素。访问有默认值得新元素,该异常不会被抛出。
public class IncompleteAnnotationException extends RuntimeException
定义注解保留策略,与Retention配合使用,以决定注解在整个开发周期中的生存时间
public enum RetentionPolicy {
SOURCE,源码中保留的注解,在编译时候移除,不写入字节码
CLASS,默认的注解,在源码和类文件中都保留的注解,在加载类时移除。可做字节码级别的预处理。
RUNTIME 在源码、类文件、运行时都存在的注解,经常运用于反射中。
}
定义java程序元素类型,与Target元注解配合使用,以便限定在每些程序元素上使用某注解
public enum ElementType {
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 {
}
http://blog.****.net/lifetragedy/article/details/7394910