关于ClassLoader.getSystemClassLoader()和Thread.currentThread().getContextClassLoader()

今天碰到一个问题,我做了一个动态编译的程序,但在javaSE环境直接运行(即javaApplication状态)可以运行,但在tomcat服务器上通过请求来处理就不行,提示找不到我动态生成的类:关键语句如下
在这里插入图片描述

(报错时我写的是:return ClassLoader.getSystemClassLoader())

最后我发现写成如图这样,调用Thread.currentThread().getContextClassLoader().loadClass(name);,就不会报错了。

查询资料后解释如下:

ClassLoader.getSystemClassLoader方法无论何时均会返回ApplicationClassLoader,其只加载classpath下的class文件。

在javaSE环境下,一般javaSE项目的classpath为bin/目录,因此只要编译后的class文件在classpath下就可以。此时ApplicationClassLoader就可以加载动态生成的类。

但在javaEE环境下,我们的项目里的类是通过WebAppClassLoader类来加载的,此时我们获取了ApplicationClassLoader,因此自然找不到class文件。

因此我们可以使用Thread.currentThread().getContextClassLoader()来获取WebAppClassLoader来加载,就不会报错了。

Thread.currentThread().getContextClassLoader()里面没有找到直接加载字节码的方法,能问下你是怎么加载的吗?
直接调父类ClassLoader中的defineClass方法就可以加载字节码了

参考文章:
1、https://blog.csdn.net/xcxy2015/article/details/80746614

猜你喜欢

转载自blog.csdn.net/yangyangrenren/article/details/121589233