本文共 1757 字,大约阅读时间需要 5 分钟。
@interface Empty{ String field1() default "it's empty"; //default 设置默认值}@Empty //使用 default默认值"it's empty"class C{ }//如果没有使用default设置默认值的话,field必须显式传入参数,如下@Empty(field1="empty A")class A{ }@interface Value{ String value(); String other() default "it's great";}@Value("empty B") //当注解有一个方法value时,没有其他方法或者其他方法有默认值,不需要指明具体方法class B{ }
@Documented@interface DocumentedAnnotation{ }@interface UnDocumentedAnnotation{}@DocumentedAnnotation@UnDocumentedAnnotationclass A{}
//RetentionPolicy是一个枚举类,默认是CLASS,此外还可选择SOURCE,RUNTIME@Retention(RetentionPolicy.CLASS) @interface ClassRetentionAnnotation{}
SOURCE代表源码级别,注解只存在源码中,其功能是与编译器交互,用于代码检测,如@Override,@SuppressWarings,许多框架如Dragger就是使用这个级别的注解,这个级别的框架额外效率损耗发生在编译时
CLASS代表字节码级别,注解存在源码与字节码文件中,主要用于编译时生成而外的文件,如XML,Java文件等,这个级别需要添加JVM加载时候的代理(javaagent ),使用代理来动态修改字节码文件(由于Android虚拟机并不支持所以本专题不会再做介绍,在Android中可以使用aspectJ来实现类似这个级别的功能)
RUNTIME代表运行时级别,注解存在源码,字节码与Java虚拟机中,主要用于运行时反射获取相关信息,许多框架如OrmLite就是使用这个级别的注解,这个级别的框架额外的效率损耗发生在程序运行时
@Target(ElementType.METHOD) //限制了注解只能修饰方法,ElementType是一个枚举类@Retention(RetentionPolicy.SOURCE)public @interface Override{ }
@Inherited@Retention(RetentionPolicy.Runtime)@interface Inheritable{}@interface UnInheritable{}public class Test{ @UnInheritable @Inheritable public static class Super{ } public static class Sub extends Super { } public static void main(String... args){ Super instance=new Sub(); System.out.println(Arrays.toString(instance.getClass().getAnnotations())); }}
转载地址:http://atqli.baihongyu.com/