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);
如果文章對您有所幫助,可以點一下推薦哦