原文章地址
概念:注解用于给java代码添加元数据,在编译或者运行时解析处理这些元数据。注解可用于包,类,字段,方法,参数等。可以将理解为给这些包或类等等添加一个标签。在使用框架的时候会发现各种框架都实现了自己的注解。实际上就是在类扫描的时候特殊处理这些含有注解的类或方法或字段而已。
注解也属于一种类型,就像class,interface一样,可以自定义,格式如下
[@Target] [@Retention] [@Documented] [@Inherited] public @interface [名称] { // 元素 }使用注解有几个条件:注解声明、使用注解的元素、操作注解使其起作用(注解处理器)。 创建一个Bean的注解
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Bean { String value(); //也可以设置默认值 //String value() default "entity"; }测试注解
@Bean("abc") public class AnnotationDemo { public static void main(String[] args) { AnnotationDemo a=new AnnotationDemo(); Class cls=AnnotationDemo.class; //使用反射获取注解 Bean annotation=(Bean) cls.getAnnotation(Bean.class); System.out.println(annotation.value()); } }输出
abc元注解就是注解其他注解的注解 在java中有4个元注解
注解作用取值@Target设置注解可以应用的位置,比如在类上,还是方法上下文中@Retention设置注解的生存时间下文中@Document说明注解是否能被文档化无@Inhrited说明注解能否被继承无 @Target取值 ElementType.CONSTRUCTOR 可以给构造方法进行注解ElementType.FIELD 可以给属性进行注解ElementType.LOCAL_VARIABLE 可以给局部变量进行注解ElementType.METHOD 可以给方法进行注解ElementType.PACKAGE 可以给一个包进行注解ElementType.PARAMETER 可以给一个方法内的参数进行注解ElementType.ANNOTATION_TYPE 可以给一个注解进行注解ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举 Retention:取值 RetentionPolicy.SOURCE阶段(java源文件阶段)RetentionPolicy.CLASS阶段(class文件阶段)RetentionPolicy.RUNTIME阶段(内存中的字节码运行时阶段)默认是在RetentionPolicy.CLASS阶段此时可以明白上述Bean注解应用于类,周期是运行时期
代码示例:
//如果没有@Retention(RetentionPolicy.RUNTIME),在反射时拿不到相应的值,会抛空指针异常,因为默认注解生存时间是class文件 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Bean2 { String a(); int b(); boolean c(); long[] d(); }测试
@Bean2(a="aaaa",b=99,c=false,d={1,3,5,7,9}) public class AnnotationDemo2 { public static void main(String[] args) { Class cls=AnnotationDemo2.class; Bean2 bean2=(Bean2) cls.getAnnotation(Bean2.class); System.out.println(bean2.a()); System.out.println(bean2.b()); System.out.println(bean2.c()); System.out.println(Arrays.toString(bean2.d())); } }控制台打印
aaaa 99 false [1, 3, 5, 7, 9]