Java获取类、方法、属性上的注解
来源:互联网 发布:淘宝网图书人性的弱点 编辑:程序博客网 时间:2024/06/14 07:36
一、获取类上的注解
Java获取类上的注解有下面3个方法:
- Class.getAnnotations() 获取所有的注解,包括自己声明的以及继承的
- Class.getAnnotation(Class< A > annotationClass) 获取指定的注解,该注解可以是自己声明的,也可以是继承的
- Class.getDeclaredAnnotations() 获取自己声明的注解
下面,我们来演示一下3个方法的使用。
首先,我们定义两个注解ParentAnnotation、SubAnnotation
@Retention(RetentionPolicy.RUNTIME)@Target(value={ElementType.TYPE})@Documented@Inherited //可以继承public @interface ParentAnnotation {}@Target(value={ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface SubAnnotation {}
接下来,我们定义两个类,Parent、Sub,分别标注ParentAnnotation 注解和SubAnnotation注解
@ParentAnnotationpublic class Parent {}@SubAnnotationpublic class Sub extends Parent{}
一切准备OK后,就开始测试了。
public class AnnotationTest { public static void main(String[] args) { Annotation[] allAnnos = Sub.class.getAnnotations(); Annotation[] deAnnos = Sub.class.getDeclaredAnnotations(); Annotation subAnnotation = Sub.class.getAnnotation(SubAnnotation.class); Annotation parentAnnotation = Sub.class.getAnnotation(ParentAnnotation.class); printAnnotation("all",allAnnos); printAnnotation("declare",deAnnos); printAnnotation("sub",subAnnotation); printAnnotation("parent",parentAnnotation); } private static void printAnnotation(String msg,Annotation... annotations){ System.out.println("=============="+msg+"======================"); if(annotations == null){ System.out.println("Annotation is null"); } for (Annotation annotation : annotations) { System.out.println(annotation); } System.out.println(); }}执行结果:==============all======================@com.ghs.test.annotation.ParentAnnotation()@com.ghs.test.annotation.SubAnnotation()==============declare======================@com.ghs.test.annotation.SubAnnotation()==============sub======================@com.ghs.test.annotation.SubAnnotation()==============parent======================@com.ghs.test.annotation.ParentAnnotation()
尝试着将ParentAnnotation中的@Inherited去掉,结果如下:
==============all======================@com.ghs.test.annotation.SubAnnotation()==============declare======================@com.ghs.test.annotation.SubAnnotation()==============sub======================@com.ghs.test.annotation.SubAnnotation()==============parent======================null
再试着将Sub类中的SubAnnotation去掉,结果如下:
==============all====================================declare====================================sub======================null==============parent======================null
经过几番小小的测试,我们基本上可以得出下面几条结论:
- 注解只有标注了@Inherited才能被子类继承
- 当某个类没有标注任何注解时,getAnnotations()和getDeclaredAnnotations()返回空数组
- 当某个注解查询不到时,getAnnotation(Class< A > annotationType)方法返回null
二、获取方法上的注解
修改上面的ParentAnnotation与SubAnnotation,使其可以标注在方法上
@Target(value={ElementType.TYPE, ElementType.METHOD})
在Sub、Parent中分别添加一个test()方法,如下:
@ParentAnnotationpublic class Parent { @ParentAnnotation public void test(){ }}@SubAnnotationpublic class Sub extends Parent{ @SubAnnotation public void test(){ }}
一切准备就绪,就可以进行测试了。
private static void testMethodAnnotation() { Method[] methods = Sub.class.getMethods(); for (Method method : methods) { if(method.getName().equals("test")){ Annotation[] allMAnnos = method.getAnnotations(); Annotation[] deMAnnos = method.getDeclaredAnnotations(); Annotation subMAnno = method.getAnnotation(SubAnnotation.class); Annotation parentMAnno = method.getAnnotation(ParentAnnotation.class); printAnnotation("allMAnnos",allMAnnos); printAnnotation("deMAnnos",deMAnnos); printAnnotation("subMAnno",subMAnno); printAnnotation("parentMAnno",parentMAnno); } }}
执行结果如下:
==============allMAnnos======================@com.ghs.test.annotation.SubAnnotation()==============deMAnnos======================@com.ghs.test.annotation.SubAnnotation()==============subMAnno======================@com.ghs.test.annotation.SubAnnotation()==============parentMAnno======================null
尝试着删除Sub中的test方法,再次进行测试,结果如下:
==============allMAnnos======================@com.ghs.test.annotation.ParentAnnotation()==============deMAnnos======================@com.ghs.test.annotation.ParentAnnotation()==============subMAnno======================null==============parentMAnno======================@com.ghs.test.annotation.ParentAnnotation()
经过两轮测试,可以得出以下结论:
- 子类重写的方法,注解无法被继承
- 针对方法而言,getAnnotations()与getDeclaredAnnotations()返回的结果似乎永远都是一样的。
附:针对此结论,如有不同的想法,还望不吝赐教
三、获取属性上的注解
修改上面的ParentAnnotation与SubAnnotation,使其可以标注在属性上
@Target(value={ElementType.TYPE, ElementType.METHOD,ElementTypeFIELD})
在Sub、Parent中分别添加一个name属性,如下:
@ParentAnnotationpublic class Parent { @ParentAnnotation public String name; @ParentAnnotation public void test(){ }}@SubAnnotationpublic class Sub extends Parent{ @SubAnnotation public String name; @SubAnnotation public void test(){ }}
下面开始测试:
private static void testFieldAnnotation() { Field[] fields = Sub.class.getFields(); for (Field field : fields) { Annotation[] allFAnnos= field.getAnnotations(); Annotation[] deFAnnos = field.getDeclaredAnnotations(); Annotation subFAnno = field.getAnnotation(SubAnnotation.class); Annotation parentFAnno = field.getAnnotation(ParentAnnotation.class); printAnnotation("allFAnnos",allFAnnos); printAnnotation("deFAnnos",deFAnnos); printAnnotation("subFAnno",subFAnno); printAnnotation("parentFAnno",parentFAnno); System.out.println("**************************************************\n"); }}
执行结果如下:
==============allFAnnos======================@com.ghs.test.annotation.SubAnnotation()==============deFAnnos======================@com.ghs.test.annotation.SubAnnotation()==============subFAnno======================@com.ghs.test.annotation.SubAnnotation()==============parentFAnno======================null**************************************************==============allFAnnos======================@com.ghs.test.annotation.ParentAnnotation()==============deFAnnos======================@com.ghs.test.annotation.ParentAnnotation()==============subFAnno======================null==============parentFAnno======================@com.ghs.test.annotation.ParentAnnotation()**************************************************
经过测试,我们可以得出下面的几个结论:
- 父类的属性和子类的属性互补干涉
- 针对属性而言,getAnnotations()与getDeclaredAnnotations()方法返回的结果似乎都是一样的
附:针对此结论,如有不同的想法,还望不吝赐教
0 0
- Java获取类、方法、属性上的注解
- JAVA反射获取属性注解,类方法
- java 类,变量,方法上注解值的获取
- Java 使用反射获取类、方法、属性上的注释
- 获取类的方法上的所有方法上的注解
- 获取类的方法上的所有方法上的注解(二)
- java通过Annotation对象获取注解属性的值
- 利用反射获取类或者方法或者字段上的注解的值
- 利用反射获取类或者方法或者字段上的注解的值
- Java获取集合泛型的类型上的注解
- Java反射 获取某个类的属性值、字段名、注解等常用代码
- java 获取调用此方法的方法的注解
- Java反射获取类的属性值和方法
- Java反射机制获取/调用类的属性和方法
- 获取Java类中所有的方法和属性
- java中获取系统属性的方法
- Java中获取系统属性的方法
- java 自定义注解验证 (仅限于实体属性值上的注解)
- 1038. 统计同成绩学生
- Hadoop中伪分布的搭建
- 当前上下文中不存在名称"xxx"
- LA 3635
- 基础平台研发
- Java获取类、方法、属性上的注解
- 招聘要求
- 摆方格(数学)
- ios 各种项目源码
- Android实现类似ios滑动按钮
- Centos7.2搭建JDK、Tomcat、MySql环境
- 二叉树的遍历
- SDCMS全局标签
- AOJ.866 飞越原野 (三维BFS)