请教一个类加载及类覆盖的问题

冯立彬
架构领域优质创作者
2013-07-18 04:53:37
在JDK1.5里面自带了JAXP1.3,可是在我们的应用中要使用到JAXP1.4,根据类加载的原理,如果相同的CLASSLOADER中存在已经加载了一个相同的类,这里指的相同的类就是类的绝对路径相同,就不会再加载另外相同的类了,这个时候即使把JAXP1.4放到我们的应用中,相同的类也是不会被JVM所加载,即此时JAXP1.4是不起作用的。
这个时候我采取了通过在应用中去加载JAXP1.4的方式,就是通过URLClassloader将其加载到相应的SystemClassLoader(即AppClassLoader)中,这个倒是可以把JAXP1.4加载进去,功能正常。将应用发布到Websphere中,发现JAXP被加载到了BootstrapClassLoader中(Why?),通过client应用,发现JAXP被加载到了AppClassLoader中,都可以正常使用。
我的问题是:这个时候JAXP1.4为什么通过被加载进去?覆盖原理是什么?另外就是为什么在WS中JAXP被加载到了BootstrapClassLoader中?先谢了。
以下是使用自定义加载的JAVA类:


public static void addJarFileToClasspath(File jarFile, boolean addMainfestClasspath) throws IOException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
List<URL> urls = new ArrayList<URL>(5);
urls.add(jarFile.toURI().toURL());

if (addMainfestClasspath) {
JarFile jf = new JarFile(jarFile);
Manifest mf = jf.getManifest();
if (mf != null) {
String cp = mf.getMainAttributes().getValue("class-path");
if (cp != null) {
for (String cpe : cp.split("//s+")) {
File lib = new File(jarFile.getParentFile(), cpe);
urls.add(lib.toURI().toURL());
}
}
}
jf.close();
}

URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class<? extends URLClassLoader> sysclass = URLClassLoader.class;

Method method = sysclass.getDeclaredMethod("addURL", URL.class);
method.setAccessible(true);
for (URL url : urls) {
method.invoke(sysloader, url);
}

}
...全文
228 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
冯立彬 2013-07-19
  • 打赏
  • 举报
回复
Waiting...
hellen_99010 2013-07-19
  • 打赏
  • 举报
回复
不同的容器类的加载器应该是不尽相同的。这要看具体容器的实现。如tomcat的
出于安全它是由上往下加载。楼主可以参考下tomcat加载器的实现

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧