【Java 】 如何通过 反射 获取 注解信息 ?

我们在设计框架的时候经常需要通过反射获取 类或方法 上的注解信息

比如在 Spring 中,我们需要在相应的类上添加 @Controller、@Servlet、@Component 等注解,从而让 Spring 生成 Bean

并且 我们还有必要在注解中添加信息

比如在 Contoller 中,我们需要往 @RequestMapping 中添加 url 信息,如下

@RequestMapping("/index")

这样 SpringMVC 才能正确映射 url 与 Controller 的关系

那么接下来,我们就一起学习下如何通过反射获取注解信息

判断元素上是否存在指定注解

  1. 先获取元素对象(类对象、方法对象)

  2. 调用 public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) 方法,参数是需要判断的注解

代码实例

			Class<?> cl = Class.forName("com.zhuyuanjie.AnnoDemo");

            if (cl.isAnnotationPresent(MyAnno.class)) {
                System.out.println("存在 @MyAnno注解 ");
            }

上面代码 判断 AnnoDemo类 上是否存在 @MyAnno 注解,有返回true,否者返回false

获取注解注解对象

有时候我们不能仅仅判断是否存在注解,还需要获取注解中的信息,那么就有必要取获取到注解对象了

获取步骤与前面相类似

  1. 先获取元素对象(类对象、方法对象)

  2. 调用 public <A extends Annotation> A getAnnotation(Class<A> annotationClass) 方法,获取到注解对象,还可以通过 getAnnotations 方法获取全部注解

代码实例

获取某个方法上的注解,并读取指定的信息

Class<?> cl = Class.forName("com.zhuyuanjie.AnnoDemo");
Method addMethod = cl.getMethod("add",String.class);
Annotation annotation = addMethod.getAnnotation(RequestMapping.class);
RequestMapping requestMapping = (RequestMapping) annotation;

上面我们就获取到了 AnnoDemo 类的 add 方法上的 @RequestMapping 注解对象

我们查看 RequestMapping 代码

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface RequestMapping {

    String value() default "";

}

发现它有一个 value 属性,我们可以直接通过 requestMapping.value() 获取到 value 的值

以上就是在框架中最常用到的 通过反射获取注解信息 的方法,希望对你有所帮助^-^

end

评论

新增邮件回复功能,回复将会通过邮件形式提醒,请填写有效的邮件!