前言

开发程序的时候使用了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. jmeter操作数据库增删改查的注意事项

    一,场景 1.在jmeter造数据后,可通过数据库查询数据库是否新增数据,判断脚本执行是否成功. 2.有些数据新增不可重复,因此脚本执行后需要将新增的数据删除,才能再次执行脚本. 二.连接数据库 在通 ...

  2. 获取img标签文件大小

    创建一个请求,然后查看返回的content-length img.src.length * 0.75 canvas转base64后

  3. 2025dsfz-KMP学习笔记

    KMP 前言:这把高端局 关于KMP 时间复杂度为 \(O(n+m)\) 的优秀字符串查找算法. 适用于在句子/文章中查找一段文字(词语). KMP实现 关于共同前后缀数组(PMT) 说人话就是 \( ...

  4. 2025dsfz集训Day6: 数论

    DAY6: 数论 \[Designed\ By\ FrankWkd\ -\ Luogu@Lwj54joy,uid=845400 \] 特别感谢 此次课的主讲 - Kwling 快速幂 快速幂是针对快速 ...

  5. HarmonyOS运动开发:如何监听用户运动步数数据

    前言 在开发运动类应用时,准确地监听和记录用户的运动步数是一项关键功能.HarmonyOS 提供了强大的传感器框架,使得开发者能够轻松地获取设备的运动数据.本文将深入探讨如何在 HarmonyOS 应 ...

  6. 27.7K star!这个SpringBoot+Vue人力资源管理系统,让企业开发事半功倍!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 "只需一个脚手架,轻松搭建企业级人事管理系统!" 微人事(vhr)是一款 ...

  7. Django批量创建Model实例

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

  8. 将Spring Boot项目部署到自己的服务器上

    第一步: 先准备好MobaXterm,链接上服务器后进入宝塔面板 https://www.bt.cn/new/download.html 找到Linux面板安装脚本复制命令 第二步: 进入MobaXt ...

  9. React Native开发鸿蒙Next---富文本浏览

    React Native开发鸿蒙Next---富文本浏览 最近在继续开发App剩余的社区功能.地铁的社区相对较为特殊,只有公告/政策规章/操作指南等资讯阅读功能,无法进行交互.对于原先的社区RN,除了 ...

  10. odoo14忘记后台密码解决办法

    直接在数据库里面修改: # 更新密码(假设用为 id 为 1,可通过 SELECT 进行查询) UPDATE res_users SET password_crypt='your new passwo ...