我们在设计框架的时候经常需要通过反射获取 类或方法 上的注解信息
比如在 Spring 中,我们需要在相应的类上添加 @Controller、@Servlet、@Component 等注解,从而让 Spring 生成 Bean
并且 我们还有必要在注解中添加信息
比如在 Contoller 中,我们需要往 @RequestMapping 中添加 url 信息,如下
@RequestMapping("/index")
这样 SpringMVC 才能正确映射 url 与 Controller 的关系
那么接下来,我们就一起学习下如何通过反射获取注解信息
判断元素上是否存在指定注解
先获取元素对象(类对象、方法对象)
调用
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
获取注解注解对象
有时候我们不能仅仅判断是否存在注解,还需要获取注解中的信息,那么就有必要取获取到注解对象了
获取步骤与前面相类似
先获取元素对象(类对象、方法对象)
调用
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 的值
以上就是在框架中最常用到的 通过反射获取注解信息 的方法,希望对你有所帮助^-^