java注解的学习

来源:互联网 发布:手机海拔高度软件 编辑:程序博客网 时间:2024/06/17 16:08

跳转到推荐的作者

Documented——指明拥有这个注解的元素可以被javadoc此类的工具文档化。这种类型应该用于注解那些影响客户使用带注释的元素声明的类型。如果一种声明使用Documented进行注解,这种类型的注解被作为被标注的程序成员的公共API 。
Inherited——指明该注解类型被自动继承。如果用户在当前类中查询这个元注解类型并且当前类的声明中不包含这个元注解类型,那么也将自动查询当前类的父类是否存在Inherited元注解,这个动作将被重复执行知道这个标注类型被找到,或者是查询到顶层的父类。
Retention——指明在什么级别显示此注解
Target——指明该类型的注解可以注解的程序元素的范围
Documented与Inherited是典型的标识性注解,也就是说在注解内部并没有成员变量,没有成员变量的注解称为标识注解
Target主要的参数类型包括以下几种

ElementType.TYPE 用于类,接口,枚举但不能是注解
ElementType.FIELD 作用于字段,包含枚举值
ElementType.METHOD 作用于方法,不包含构造方法
ElementType.PARAMETER 作用于方法的参数
ElementType.CONSTRUCTOR 作用于构造方法
ElementType.LOCAL_VERIABLE 作用于本地变量或者catch语句
ElementType.ANNOTATION_TYPE 作用于注解
ElementType.PACKAGE 作用于包
Retention主要的参数类型包括以下几种

RetentionPolicy.SOURCE 注解存在于源代码中,编译时会被抛弃
RetentionPolicy.CLASS 注解会被编译到class文件中,但是JVM会忽略

RetentionPolicy.RUNTIME JVM会读取注解,同时会保存到class文件中

案例

@Documented@Inherited//该注解可以作用于方法,类与接口@Target({ElementType.METHOD,ElementType.TYPE})//JVM会读取注解,所以利用反射可以获得注解@Retention(RetentionPolicy.RUNTIME)public @interface TestAnnotation {    //定义成员变量    //成员变量可以通过default指定默认值    //如果成员变量不指定默认值的情况下    //我们在引用接口时则必须给没有默认值的成员变量赋值    String name() ;     int age() default 18 ;}

现在就测试当前的注解类


public class Test{public static void main(String[] args) {//解析注解//获得我们需要解析注解的类Class<Test> clz = Test.class;//解析Class//由于我们的注解是可以给类使用的,所以首先判断类上面有没有我们的注解//判断类上面是否有注解boolean clzHasAnnotation = clz.isAnnotationPresent(TestAnnotation.class);if(clzHasAnnotation){//类存在我们定义的注解//获得注解TestAnnotation clzAnnotation = clz.getAnnotation(TestAnnotation.class);//输出注解在类上的属性System.out.println("name="+clzAnnotation.name()+"\tage="+clzAnnotation.age());}//解析Method//两种解析方法上的注解方式//获得类中所有方法Method[] methods = clz.getMethods();//第一种解析方法for(Method m : methods){//获得方法中是否含有我们的注解boolean methodHasAnnotation = m.isAnnotationPresent(TestAnnotation.class);if(methodHasAnnotation){//注解存在//获得注解TestAnnotation methodAnnotation = m.getAnnotation(TestAnnotation.class);System.out.println("name="+methodAnnotation.name()+"\tage="+methodAnnotation.age());}}//第二种解析方式for(Method m : methods){//获得方法上所有注解Annotation[] annotations = m.getAnnotations();//循环注解for(Annotation a : annotations){//如果是我们自定义的注解if(a instanceof TestAnnotation){//输出属性,需要强制装换类型System.out.println("name="+((TestAnnotation)a).name()+"\tage="+((TestAnnotation)a).age());}}}}




0 0