最近学习Java ClassLoader机制,总是觉得理解不透,感觉有些东西理解起来有点力不从心,但经过几天学习还是有所收获,同时也明白了一些以前不明白的道理,下面是一个例子程序,结合程序说明我对ClassLoader File RUL URI等的一些感悟;
1。代码明细,本例总共有三个类:ClassLoaderFactory.java,Loader.java,Tester.java,先列出代码:
import java.io.File;
import java.io.FileFilter;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
public class ClassLoaderFactory {
private FileFilter fileFilter = new FileFilter() {
public boolean accept(File pathname) {
return pathname.getName().toLowerCase().endsWith(".class");
}
};
public ClassLoader createClassLoader() throws Exception {
List<URL> urlList = new ArrayList<URL>();
File dir = new File("C://java//lib");
File[] files = dir.listFiles(fileFilter);
for (File f : files) {
urlList.add(f.toURL());
System.out.println(f.toURI());
}
return new URLClassLoader(urlList.toArray(new URL[urlList.size()]),
Thread.currentThread().getContextClassLoader());
}
}
public class Loader {
public void service() {
System.out.println("the classloader tester!");
}
}
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import sun.misc.Launcher;
public class Tester {
@SuppressWarnings("static-access")
public static void main(String[] args) throws URISyntaxException,
IOException, InstantiationException, IllegalAccessException,
Exception {
Loader loader1 = (Loader) Thread.currentThread()
.getContextClassLoader().loadClass(
"com.tibco.xformdemo.other.Loader").newInstance();
loader1.service();
Loader loader2 = (Loader) new ClassLoaderFactory().createClassLoader()
.loadClass("com.tibco.xformdemo.other.Loader").newInstance();
loader2.service();
System.out.println();
URL[] urls = Launcher.getBootstrapClassPath().getURLs();
for (URL u : urls) {
System.out.println(u);
}
System.out.println();
ClassLoader loader = Tester.class.getClassLoader();
System.out.println(loader);
System.out.println(loader.getSystemClassLoader());
System.out.println(loader.getParent());
System.out.println();
URL url = Tester.class.getResource("asd.txt");
URI uri = url.toURI();
File file = new File(uri);
System.out.println(url);
System.out.println(uri);
System.out.println(file.getAbsolutePath());
System.out.println(file.getCanonicalPath());
System.out.println();
Thread thread = Thread.currentThread();
System.out.println(thread);
System.out.println(thread.getId());
System.out.println(thread.getName());
System.out.println(thread.getPriority());
System.out.println("--------------");
System.out.println(thread.getContextClassLoader());
System.out.println(thread.getContextClassLoader().getClass());
System.out.println("--------------");
System.out.println(thread.getContextClassLoader().getParent());
System.out.println(thread.getContextClassLoader().getParent()
.getClass());
System.out.println(Tester.class.getClass());
System.out.println();
InputStream in = Tester.class.getResourceAsStream("asd.txt");
System.out.println(in);
}
}
注意在C盘下建立java文件夹,然后在java下建立lib文件夹,否则会出现空指针异常
2. 贴出运行Tester.java的结果:
the classloader tester!
the classloader tester!
file:/C:/jdk1.6.0_10/jre/lib/resources.jar
file:/C:/jdk1.6.0_10/jre/lib/rt.jar
file:/C:/jdk1.6.0_10/jre/lib/sunrsasign.jar
file:/C:/jdk1.6.0_10/jre/lib/jsse.jar
file:/C:/jdk1.6.0_10/jre/lib/jce.jar
file:/C:/jdk1.6.0_10/jre/lib/charsets.jar
file:/C:/jdk1.6.0_10/jre/classes
sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
file:/D:/IS/workspace/Xform%20use%20Demo/com.---.xformDemo/bin/com/---/xformdemo/other/asd.txt
file:/D:/IS/workspace/Xform%20use%20Demo/com.---.xformDemo/bin/com/---/xformdemo/other/asd.txt
D:/IS/workspace/Xform use Demo/com.---.xformDemo/bin/com/---/xformdemo/other/asd.txt
D:/IS/workspace/Xform use Demo/com.---.xformDemo/bin/com/---/xformdemo/other/asd.txt
Thread[main,5,main]
1
main
5
--------------
sun.misc.Launcher$AppClassLoader@19821f
class sun.misc.Launcher$AppClassLoader
--------------
sun.misc.Launcher$ExtClassLoader@addbf1
class sun.misc.Launcher$ExtClassLoader
class java.lang.Class
java.io.BufferedInputStream@1b67f74