Legacy Study notes(ClassLoader File URL URI)

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

 


 

 

转载于:https://my.oschina.net/iwuyang/blog/197210

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值