由Resin引发的java.lang.IllegalArgumentException: object is not an instance of declaring class(反射中使用)思考
2024-09-08 04:03:15
背景
在java agent中抓取Resin的 某些方法,在invoke的时候出现错误
java.lang.IllegalArgumentException: object is not an instance of declaring class
出现这个问题的原因是通过clazz找到的method,在真正invoke的时候传进去的clazz是不一样的。
原因
代码重构后再插件中Method进行了缓存(static)导致
provite Static Method mmm = null
if(method == null){
methodFromCache = clazz.getMethod("methodname", parameterTypes);
}
method.invoke(clazz,parameterTypes)
//我们这里的methodname是request
我们这里的clazz是request
通过debug发现在resin刚刚启动的时候会通过某种机制(位置)发送一个request,com.xxxx.xxxx.httpreqest,在客户端再次访问,再次发送一次request,com.xxxx.xxx.dispetchrequest
第一次将request缓存了进去(com.xxxx.xxxx.httpreqest),第二次直接取,可是第二次的clazz变成了com.xxxx.xxx.dispetchrequest,所以出现了上面的错误。
解决办法
通过map缓存方法,map中的key是classname+method name作为唯一确定一个方法的标识,value是classname
private static Map<String, Method> methodMap = new HashMap<String, Method>();
String methodId = className + methodName;
Method method = methodMap.get(methodId);
if(method == null){
methodFromCache = clazz.getMethod("methodname", parameterTypes);
}
method.invoke(clazz,parameterTypes)
这样保证了方法名其实是classname+methodname,这样也就不会出现上面的问题了。
最新文章
- 零OCR基础6行代码实现C#验证码识别
- WIN7 + IIS7 Service Unavailable HTTP Error 503. The service is unavailable.
- myeclipse ctrl + 鼠标单击 出现 source not found
- myeclipse启动tomcat会出现 a java exception has occured错误 的解决方法
- 根据某个文件或文件夹自制rpm包
- Java并发编程笔记—基础知识—实用案例
- 【转】MySQL Temporary Table相关问题的探究
- Nginx简单配置
- 使用console进行性能测试和计算代码运行时间
- linux运维、架构之路-Zabbix监控应用及分布式
- jquery源码分析之一前言篇
- HTTP/1.1 chunked 解码
- windows 8.1 cmd命名提示符全屏
- Linux 查找文件内容、替换
- [转帖]龙芯下一代处理器微结构GS464E细节曝光
- 一次 Java 内存泄漏排查过程,涨姿势
- 读书--编写高质量代码 改善C#程序的157个建议2
- WM_COPYDATA
- java 循环中使用list时,出现list中全部加入了对象导致没有实现分组的解决方案
- IPV6 国内进展情况
热门文章
- 【Tomcat】1.Tomcat在Windows系统的安装和使用
- Django中get()和fiter()的区别
- 个人笔记 - MATLAB
- linux卸载
- SQLserver服务无法启动
- Spingboot整合Redis,用注解(@Cacheable、@CacheEvict、@CachePut、@Caching)管理缓存
- Spring Boot国际化支持
- java虚拟机规范(se8)——java虚拟机的编译(二)
- Source object main.o has EABI version 0, but target ../../../bin/ad has EABI version 5
- 开启linux下面vsftp自身的服务