1. 问题现象
开发框架使用Spring Boot,启动程序时通过Class对象获取对象上的注解信息,运行时未获取到注解信息。
2. 问题原因
程序启动时获取的Class对象时Spring通过CGLIB生成的代理对象,不是原始对象,因此无法通过代理对象的Class信息获取注解信息。
获取到的class信息如下:
由图可知该对象并不是原始对象,而是cglib代理对象
3. 解决方法
3.1 Spring 的 AnnotationUtils 工具类
AnnotationUtils.findAnnotation(beanClazz, WebServiceAction.class);
beanClazz:cglib生成的Class对象
WebServiceAction:获取的注解类型
3.2 通过反射原始类信息获取原始对象的Class对象
Type superclassType = beanClazz.getGenericSuperclass(); // superclassType.getTypeName()获取的是原始类的完全限定名,包路径+类名 Class beanClazz = Class.forName(superclassType.getTypeName()); WebServiceAction annotation = beanClazz.getAnnotation(WebServiceAction.class);