由Resin引发的java.lang.IllegalArgumentException: object is not an instance of declaring class(反射中使用)思考
背景
在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(反射中使用)思考的更多相关文章
- java.lang.IllegalArgumentException: object is not an instance of declaring class
今天在使用反射的时候,出现了java.lang.IllegalArgumentException: object is not an instance of declaring class错误-具体是 ...
- 报错: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 ...
- java.lang.IllegalArgumentException: object is not an instance of declaring class新发现
文章目录 背景 报错 解决 引申 背景 因为要将方法缓存起来提高性能 报错 java.lang.IllegalArgumentException: object is not an instance ...
- 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 ...
- 【IllegalArgumentException】: object is not an instance of declaring class
java.lang.IllegalArgumentException: object is not an instance of declaring class 日前在调试动态代理的例子中,出现以上报 ...
- [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类中很有用的一个方法,可以用它来给空间附加一些信息 ...
- Spring与JDK版本不一致引发问题Caused by: java.lang.IllegalArgumentException
tomcat启动一个spring的项目,tomcat使用8.5,JDK使用1.8,Spring使用3.0,启动之后报错 Caused by: java.lang.IllegalArgumentExce ...
- 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 ...
- jersey处理支付宝异步回调通知的问题:java.lang.IllegalArgumentException: Error parsing media type 'application/x-www-form-urlencoded; text/html; charset=UTF-8'
tcpflow以流为单位分析请求内容,非常适合服务器端接口类服务查问题 这次遇到的问题跟支付宝支付后的回调post结果有关 淘宝的代码例子: public void doPost(HttpServle ...
随机推荐
- 【开源项目】一篇文章搞掂: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 ...
- 《ArcGIS Runtime SDK for .Net开发笔记》--介绍与环境搭建
一. ArcGIS Runtime SDK for .NET介绍 ArcGIS Runtime SDK for .net是一款针对windows平台的开发包.能够在开发出在windows phone, ...
- 262K Color
262K色=2^18=262144色. 320*240是指屏幕分辨率. 你可以理解为一块黑板,这款黑板宽是3.2M,长是2.4米,以1cm为最小单位,整个黑板被分为320*240个小格子,这个小格子里 ...
- HTML5: HTML5 介绍
ylbtech-HTML5: HTML5 介绍 1. 什么是 HTML5?返回顶部 HTML5 是下一代 HTML 标准. HTML,HTML 4.01的上一个版本诞生于1999年.自从那儿以后, ...
- RabbitMQ(七)心跳控制 -- heartbeat
https://blog.csdn.net/jiao_fuyou/article/details/23186407
- Linux命令之解压
Linux命令之解压 使用tar命令解压.zip文件的时候,遇到如下异常, tar -xzvf guangwang.zip gzip: stdin has more than one entry--r ...
- Python List列表的操作说明
Python中List的N种操作,其简单程度令人叹为观止... C:\Users\rhys>python Python 2.7.14 (v2.7.14:84471935ed, Sep 16 20 ...
- 新浪sina邮箱客户端配置
接收协议:IMAP 接收邮箱服务器地址:imap.sina.com 端口:993 加密方法:TLS 发送协议:SMTP 发送服务器:smtp.sina.com 端口:465 加密方法:TLS
- linux命令du
du log2012.log 查看文件大小 du -sh * 当前目录所有文件的大小 du|sort -nr|more 按照空间大小排序 du -c log30.tar.gz log31.tar. ...
- python 三方库字典
参考:https://github.com/jobbole/awesome-python-cn 环境管理 管理 Python 版本和环境的工具 p:非常简单的交互式 python 版本管理工具.官网 ...