背景
因为要将方法缓存起来提高性能
报错
java.lang.IllegalArgumentException: object is not an instance of declaring class
解决
之前我的一篇文章:
https://blog.csdn.net/dataiyangu/article/details/88370206
说的是因为第一次构造出Method的类,和真正执行的时候的对象的类不是同一的。
经过这次发现:这个错误还和ClassLoader有关系,如果ClassLoader不相同,也会报这个错误。
log.debug("req###########################################+" + req.getClass().getClassLoader().toString());
可以看到两个request的context是不同的。
所以会报如上的错误。
引申
当然,解决的办法就是将
classLoader的hashCode+className+methodName 作为key缓存到HashMap中,
这个时候可能会报错空指针
因为,有些基础的类确实得不到ClassLoader,而在我的实际情况中,这些类(真的是得不到ClassLoader的情况)不会出现二次访问的情况,所以不需要访问,所以做如下处理即可。
ClassLoader classLoader = object.getClass().getClassLoader();
if (classLoader != null) {
int classLoaderHash = classLoader.toString().hashCode();
methodId = classLoaderHash+className + methodName;
}else{
methodId = className + methodName;
}