当前位置:编程学习 > JAVA >>

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

在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);
}

}
java classloader 类加载 jaxp --------------------编程问答-------------------- Waiting... --------------------编程问答-------------------- 不同的容器类的加载器应该是不尽相同的。这要看具体容器的实现。如tomcat的
出于安全它是由上往下加载。楼主可以参考下tomcat加载器的实现
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,