无法获取cglib代理对象上的注解的解决办法
2022/4/15 23:14:54
本文主要是介绍无法获取cglib代理对象上的注解的解决办法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前言
开发程序的时候使用了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代理对象上的注解的解决办法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升