最近学习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