文章目录

背景

在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,这样也就不会出现上面的问题了。

最新文章

  1. 零OCR基础6行代码实现C#验证码识别
  2. WIN7 + IIS7 Service Unavailable HTTP Error 503. The service is unavailable.
  3. myeclipse ctrl + 鼠标单击 出现 source not found
  4. myeclipse启动tomcat会出现 a java exception has occured错误 的解决方法
  5. 根据某个文件或文件夹自制rpm包
  6. Java并发编程笔记—基础知识—实用案例
  7. 【转】MySQL Temporary Table相关问题的探究
  8. Nginx简单配置
  9. 使用console进行性能测试和计算代码运行时间
  10. linux运维、架构之路-Zabbix监控应用及分布式
  11. jquery源码分析之一前言篇
  12. HTTP/1.1 chunked 解码
  13. windows 8.1 cmd命名提示符全屏
  14. Linux 查找文件内容、替换
  15. [转帖]龙芯下一代处理器微结构GS464E细节曝光
  16. 一次 Java 内存泄漏排查过程,涨姿势
  17. 读书--编写高质量代码 改善C#程序的157个建议2
  18. WM_COPYDATA
  19. java 循环中使用list时,出现list中全部加入了对象导致没有实现分组的解决方案
  20. IPV6 国内进展情况

热门文章

  1. 【Tomcat】1.Tomcat在Windows系统的安装和使用
  2. Django中get()和fiter()的区别
  3. 个人笔记 - MATLAB
  4. linux卸载
  5. SQLserver服务无法启动
  6. Spingboot整合Redis,用注解(@Cacheable、@CacheEvict、@CachePut、@Caching)管理缓存
  7. Spring Boot国际化支持
  8. java虚拟机规范(se8)——java虚拟机的编译(二)
  9. Source object main.o has EABI version 0, but target ../../../bin/ad has EABI version 5
  10. 开启linux下面vsftp自身的服务