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

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

关于ClassLoader.getSystemClassLoader()和Thread.currentThread().getContextClassLoader()_第1张图片

(报错时我写的是: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来加载,就不会报错了。


你可能感兴趣的:(java杂谈)