文章目录

背景

在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. 【开源项目】一篇文章搞掂:Pig微服务框架

    1.项目开发环境和运行步骤 1.1.项目开发环境 Idea:2018.1.6 Maven:3.5.3 JDK:1.8.0_172 MySQL:5.7.19(之前安装8.0.11会运行失败) Redis ...

  2. 《ArcGIS Runtime SDK for .Net开发笔记》--介绍与环境搭建

    一. ArcGIS Runtime SDK for .NET介绍 ArcGIS Runtime SDK for .net是一款针对windows平台的开发包.能够在开发出在windows phone, ...

  3. 262K Color

    262K色=2^18=262144色. 320*240是指屏幕分辨率. 你可以理解为一块黑板,这款黑板宽是3.2M,长是2.4米,以1cm为最小单位,整个黑板被分为320*240个小格子,这个小格子里 ...

  4. HTML5: HTML5 介绍

    ylbtech-HTML5: HTML5 介绍 1. 什么是 HTML5?返回顶部   HTML5 是下一代 HTML 标准. HTML,HTML 4.01的上一个版本诞生于1999年.自从那儿以后, ...

  5. RabbitMQ(七)心跳控制 -- heartbeat

    https://blog.csdn.net/jiao_fuyou/article/details/23186407

  6. Linux命令之解压

    Linux命令之解压 使用tar命令解压.zip文件的时候,遇到如下异常, tar -xzvf guangwang.zip gzip: stdin has more than one entry--r ...

  7. Python List列表的操作说明

    Python中List的N种操作,其简单程度令人叹为观止... C:\Users\rhys>python Python 2.7.14 (v2.7.14:84471935ed, Sep 16 20 ...

  8. 新浪sina邮箱客户端配置

    接收协议:IMAP 接收邮箱服务器地址:imap.sina.com 端口:993 加密方法:TLS 发送协议:SMTP 发送服务器:smtp.sina.com 端口:465 加密方法:TLS

  9. linux命令du

    du log2012.log 查看文件大小 du -sh *   当前目录所有文件的大小 du|sort -nr|more 按照空间大小排序 du -c log30.tar.gz log31.tar. ...

  10. python 三方库字典

    参考:https://github.com/jobbole/awesome-python-cn 环境管理 管理 Python 版本和环境的工具 p:非常简单的交互式 python 版本管理工具.官网 ...