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);