文章目录

背景

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

由Resin引发的java.lang.IllegalArgumentException: object is not an instance of declaring class(反射中使用)思考的更多相关文章

  1. java.lang.IllegalArgumentException: object is not an instance of declaring class

    今天在使用反射的时候,出现了java.lang.IllegalArgumentException: object is not an instance of declaring class错误-具体是 ...

  2. 报错:java.lang.IllegalArgumentException: object is not an instance of declaring class

    反射的报错信息如下: java.lang.IllegalArgumentException: object is not an instance of declaring class at sun.r ...

  3. java.lang.IllegalArgumentException: object is not an instance of declaring class新发现

    文章目录 背景 报错 解决 引申 背景 因为要将方法缓存起来提高性能 报错 java.lang.IllegalArgumentException: object is not an instance ...

  4. Android java.lang.IllegalArgumentException: Object returned from onCreateLoader must not be a non-static inn

    AsyncTaskLoader: http://developer.Android.com/intl/zh-CN/reference/android/content/AsyncTaskLoader.h ...

  5. 【IllegalArgumentException】: object is not an instance of declaring class

    java.lang.IllegalArgumentException: object is not an instance of declaring class 日前在调试动态代理的例子中,出现以上报 ...

  6. [Android] View.setTag(key,Object) (java.lang.IllegalArgumentException: The key must be an application-specific resource id.)

    转自: http://blog.csdn.net/brokge/article/details/8536906 setTag是android的view类中很有用的一个方法,可以用它来给空间附加一些信息 ...

  7. Spring与JDK版本不一致引发问题Caused by: java.lang.IllegalArgumentException

    tomcat启动一个spring的项目,tomcat使用8.5,JDK使用1.8,Spring使用3.0,启动之后报错 Caused by: java.lang.IllegalArgumentExce ...

  8. Caused by: java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [VCodeModel]

    2019-08-20 17:53:24,054 [ERROR] [http-nio-8047-exec-1] [HttpResult.java : 143] 系统异常 org.springframew ...

  9. jersey处理支付宝异步回调通知的问题:java.lang.IllegalArgumentException: Error parsing media type 'application/x-www-form-urlencoded; text/html; charset=UTF-8'

    tcpflow以流为单位分析请求内容,非常适合服务器端接口类服务查问题 这次遇到的问题跟支付宝支付后的回调post结果有关 淘宝的代码例子: public void doPost(HttpServle ...

随机推荐

  1. prototype、proto和constructor 关系

    记录: 1.构造函数:如下,Foo()就是一个构造函数 function Foo(){} 2.prototype:每一个构造函数都有一个属性叫prototype,相当于一个指针,指向它的原型对象 Fo ...

  2. ArcGIS Runtime SDK for .NET (Quartz Beta)之连接ArcGIS Portal

    1. 介绍 ArcGIS Portal作为ArcGIS平台的中枢,在ArcGIS体系中起着至关重要的地位.在ArcGIS Runtime的新架构Quartz中添加了连接ArcGIS Portal(或A ...

  3. QC增加Test、Defect字段

    QC--Tools--customization,在Project Entities中增加字段,在Project Lists中编辑Lookup List类型字段的指定值

  4. FFMpeg视频解码初探

    在视频解码前,先了解以下几个基本的概念: 编解码器(CODEC):能够进行视频和音频压缩(CO)与解压缩(DEC),是视频编解码的核心部分. 容器/多媒体文件(Container/File):没有了解 ...

  5. jquery给表格绑值

    jquery给表格绑值 直接上代码了 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  6. intellij IDEA2016如何打可执行的jar包

    尊重版权,原文地址:https://blog.csdn.net/liufeilong_sean/article/details/75254875 操作步骤: 1.在File -> project ...

  7. LOJ #103. 子串查找 (Hash)

    题意 给定两个字符串 \(A\) 和 \(B\),求 \(B\) 在 \(A\) 中的出现次数. 思路 这是一道 \(KMP\) 的模板题. 不过 \(Hash\) 是个好东西,可以用 \(Hash\ ...

  8. upc组队赛12 Janitor Troubles【求最大四边形面积】

    Janitor Troubles Problem Description While working a night shift at the university as a janitor, you ...

  9. Rust <8>:lifetime 高级语法与 trait 关联绑定

    一.生命周期关联:如下声明表示,'s >= 'c struct Parser<'c, 's: 'c> { context: &'c Context<'s>, } ...

  10. Haproxy+ssl+nvm+forever

    1 nvm介绍 NVM(Node version manager)顾名思义,就是Node.js的版本管理软件,可以轻松的在Node.js各个版本间切换,项目源码在GitHub: #安装git客户端 [ ...