前言

开发程序的时候使用了aop去代理对象,然后其他地方会获取到这个代理对象并获取上面的方法注解和参数注解,运行时却发现无法获取注解,最终折腾一番终于解决。

原因

使用了AOP去进行代理,由于代理的对象不是接口,因此springboot会使用cglib去进行代理。

debug的时候可以看到,代理对象是由cglib代理的。



然后遍历bean这个类的方法,依次获取方法上的MessageMapping注解,获取到就将其添加到map中

这里获取注解的方法是AnnotatedElementUtils.getMergedAnnotation()

但是,发现本应能获取到注解的方法,此时却无法获取到注解

通过debug继续查看下去,发现方法上的注解全部为空

获取方法上的注解

其实解决办法非常简单,只需要将上面获取注解的代码AnnotatedElementUtils.getMergedAnnotation()改为AnnotatedElementUtils.findMergedAnnotation()就能轻松解决

可以看到,通过这种方式可以成功获取到方法上的注解,并且进入了if判断

获取方法参数上的注解

随后需要获取方法参数上的注解,同样也是获取为null

这个问题是比较棘手,试过SpringBoot内置的工具类,目前没找到能正常获取注解的方式。

因此决定换个思路,直接获取cglib代理类的原始对象,获取原始对象上的参数注解就可以了

直接上代码

private Parameter getProxySourceMethodParameter(Class<?> clazz, Method method, Integer parameterIndex) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException {
boolean isCglibProxyClass = clazz.getName().contains("$$");
if (!isCglibProxyClass) {
return ArrayUtil.get(method.getParameters(), parameterIndex);
}
Class<?> sourceClass = clazz.getSuperclass();
String methodName = method.getName();
Class<?>[] methodParameterTypes = method.getParameterTypes();
Method sourceMethod = sourceClass.getDeclaredMethod(methodName, methodParameterTypes);
return ArrayUtil.get(sourceMethod.getParameters(), parameterIndex);
}

通过获取原始类的方法参数,然后再获取参数上的注解就可以解决了。

Parameter parameter = getProxySourceMethodParameter(clazz, method, paramIndex);
Ref ref = AnnotatedElementUtils.findMergedAnnotation(parameter, Ref.class);

无法获取cglib代理对象上的注解的解决办法的更多相关文章

  1. 获取JDK动态代理/CGLIB代理对象代理的目标对象。

    问题描述:: 我现在遇到个棘手的问题,要通过spring托管的service类保存对象,这个类是通过反射拿到的,经过实验发现这个类只能反射取得sservice实现了接口的方法,而extends类的方法 ...

  2. AOP之proceedingjoinpoint和joinpoint区别(获取各对象备忘)、动态代理机制及获取原理代理对象、获取Mybatis Mapper接口原始对象

    现在AOP的场景越来越多,所以我们有必要理解下和AOP相关的一些概念和机制. import org.aspectj.lang.reflect.SourceLocation; public interf ...

  3. Mybatis-简单基于源码了解获取动态代理对象

    这是我们要测试的代码 OderDao就是我们要需要获取的对象. 首先我们根据传入的参数,进入SqlSessionFactoryBuilder 中的对应的build 方法,第一步创键XMLConfigB ...

  4. ProceedingJoinPoint获取实现类接口上的注解

    使用aspectj处理拦截aop,需要获取实现类接口上的注解 public Object around(ProceedingJoinPoint pjp) throws Throwable{ long ...

  5. jquery获取不到append出来的新元素的解决办法

    jquery获取不到append出来的新元素的解决办法 $('body').on("click","property",function(){}) jq1.7+ ...

  6. 阿里云vps上mysql挂掉的解决办法

    阿里云vps上mysql挂掉的解决办法 4条回复 用阿里云的vps用作blog服务器,系统很稳定,已经100多天一直运行正常,大概从上个月开始发现blog的mysql会有时挂掉,会收到短信通知.之前没 ...

  7. Chrome不能在网易网盘中上传文件的解决办法

    Chrome不能在网易网盘中上传文件的解决办法1. 安装 Adobe Flash Player PPAPI,设置flash插件 chrome://settings/content/flash,许可[* ...

  8. (转载,但不知道谁原创)获取SPRING 代理对象的真实实例,可以反射私有方法,便于测试

    /** * 获取 目标对象 * @param proxy 代理对象 * @return * @throws Exception */ public static Object getTarget(Ob ...

  9. android 5.1 WIFI图标上的感叹号及其解决办法

    转自:http://blog.csdn.net/w6980112/article/details/45843129 第一次调试android5.1的 WIFI更改小功能 Wifi 源码的相关路径目录  ...

  10. ASP: Response 对象 错误 'ASP 0251 : 80004005' 解决办法

    Response 对象 错误 'ASP 0251 : 80004005' 超过响应缓冲区限制 这种情况一般是因为需要输出的网页内容太大了,由于asp在输入内容到客户的浏览器上之前,会把需要输出的全部内 ...

随机推荐

  1. Golang解决fatal error: all goroutines are asleep - deadlock!

    今天进行一个协程操作demo时总是报错 //workerpool.go package main import ( "fmt" "time" ) //工作线程 ...

  2. 【ROS】1.1 ROS基本命令介绍

    原视频 ROS基本命令 右键新标签页查看大图! have to do Command Command Result 中文解释 图示 roscore Open the core of the ROS. ...

  3. vue中 <el-table-column>回显转成百分比【数字转为百分比】

    一.方案1[不保留小数] 这里直接乘以100然后加入百分号既可 <el-table-column prop="refundRate15" label="15天退款率 ...

  4. Java基础之“数组扩容”

    一.Java数组扩容的思路 正常逻辑:Java数组对象的大小是固定不变的,数组对象是不可扩容的. 尽然正常的不行,我们就在new他一次,利用数组复制方法可以变通的实现数组扩容. 逻辑:先弄出一个新的数 ...

  5. WebAssembly在实际应用中的案例探究

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  6. RPC实战与核心原理之服务发现

    服务发现:到底是要CP还是AP? 回顾 "怎么设计一个灵活的 RPC 框架" 总结起来,就是怎么在 RPC 框架中应用插件,用插件方式构造一个基于微内核的 RPC 框架,其关键点就 ...

  7. Django批量创建Model实例

    1.前言: 将测试数据全部敲入数据库非常繁琐,而且如果与合作伙伴一起开发,部署,那么他们肯定也不想把时间花在一个一个录入数据的繁琐过程中,这时候,创建一个批量录入数据的脚本(population sc ...

  8. 金融科技应用:基于XGBoost与SHAP的信用评分模型构建全流程解析

    引言 在传统金融体系中,信用评估高度依赖央行征信数据,但全球仍有约20亿人口处于"信用隐形"状态.随着金融科技发展,通过整合社交数据.消费行为等替代数据源构建智能信用评估系统,已成 ...

  9. odoo14里面给所有模型添加方法

    给所有的model都添加一个方法, 即所有的model都能调用[类似于create.write.unlink.read]. 方式一: from odoo import api, fields, mod ...

  10. Spring Boot线程池简单监控|转

    背景   在我们实际项目开发中,常常会为不同优先级的任务设置相对应的线程池.一般我们只关注相关池的相关参数如核心线程数据,最大线程数据等等参数,容易忽略了对线程池中实际运行情况的监控. 综上所述:线程 ...