JAVA-注解(2)-自定义注解及反射注解
自定义注解开发
1.开发一个注解类
开发一个注解类的过程,非常类似于开发一个接口,只不过需要通过@interface关键字来声明
2.使用元注解修饰注解的声明
所谓的原注解是用来修饰注解声明的注释,可以控制被修饰的注解的特性。
@Target
用来声明被修饰的注解可以用在什么位置。
可以在@Target的属性中设置Element Type类型的数组来指定可以使用的位置。
如果不使用此原注解修饰,默认注解可以用在任意位置。
@Retention
用来声明被修饰的注释会被保留到什么阶段。
可以在该注解的属性中通过RetentionPolicy类型的值来指定注释被保留到何时。
(1)RetentionPolicy.SOURCE
此注解将会被保留到源码阶段,java中,在编译过程中被删除。
这种类型的注解通常是给编译器看的。
(2)Retention Policy.CLASS
此注解将会被保留到源码阶段和编译阶段,.java和.class中,在类加载的过程中被删除。
这种类型的注解通常是给类加载器看的。
(3)RetentionPolicy.RUNTIME
此注解将会被保留在源码阶段、编译阶段和运行阶段,.java .class和内存中的字节码中都会存在。
这种类型的注解通常在运行阶段进行反射,控制程序运行过程。
***只有RUNTIME级别的注解才可以通过反射技术进行反射。
@Documented
用来声明被修饰注解是否要被文档提取工具提取到文档中。
默认不提取
@Inherited
被修饰的注释是否具有继承性
默认没有继承性
3.为注解增加属性
注解类中还可以有声明属性。
为注解类声明属性的过程非常类似于接口定义方法。
但要求,注解中的所有的属性必须是public的,可以显式声明,也可以不声明,不声明默认就是public的。
注解中的属性只能是八种基本数据类型、String类型、Class类型、其他注解类型及以上类型的一维数组。
注解中声明的属性 需要在使用注解时,为其赋值,赋值的方式就是在使用注解时,在注解后跟上一对小括号,在括号中通过 属性名=属性值 的方式指定属性的值
也可以在声明注解时,在注解的属性后面通过default关键字,声明属性的默认值,这样一来,使用注解时不赋值,将会使用default默认值,当然也可以手动赋值,覆盖默认值。
如果属性是一维数组类型,在传入的数组中,只有一个值,则包括数组的大括号也可以省略。
如果注解的属性只有一个需要赋值,且该属性的名称叫做value,则在使用注解时,value==可以不写
反射注解
1.反射注解的原理
RetentionPolicy.RUNTIME级别的注解会保留到运行中,可以通过反射技术获取,从而可以根据是否有注解 或 注解属性值的不同来控制程序按照不同方式运行。
以下反射相关的类型中都提供了反射注解的方法:
类Class<T>、类Method、类FIeld、类Constructor<T>、类Package
2.反射注解案例
1 package cn.tedu.test; 2 3 import java.lang.annotation.ElementType; 4 import java.lang.annotation.Retention; 5 import java.lang.annotation.RetentionPolicy; 6 import java.lang.annotation.Target; 7 8 @Target(ElementType.TYPE) 9 @Retention(RetentionPolicy.RUNTIME) 10 @interface level{ 11 String value(); 12 } 13 14 @level("刑警") 15 class Police{ 16 } 17 18 public class AnnoTest02 { 19 public static void main(String[] args) { 20 System.out.println("敬了个礼,您好,您超速了,罚款200元。。。"); 21 if(Police.class.isAnnotationPresent(level.class)){ 22 level anno = Police.class.getAnnotation(level.class); 23 if("协警".equals(anno.value())){ 24 System.out.println("哥们少罚点,50块得了~~"); 25 }else if("交警".equals(anno.value())){ 26 System.out.println("哥们抽根烟,这是200块,收好我走人~~"); 27 }else if("刑警".equals(anno.value())){ 28 System.out.println("赶紧交钱走人,别查出 别的事。。。"); 29 }else{ 30 System.out.println("xxx"); 31 } 32 }else{ 33 System.out.println("打一顿,扭送警察局。。"); 34 } 35 } 36 }