最近再看 Java类加载器的问题,在此开个系列分几期来分享学习 java的类加载,先从类加载的路径讲起,至于类的3个加载器 以及双亲委派机制,将会在接下来几期根据源码阅读分享。
先上源码展示效果
首先定义一个自定义类加载器
import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLStreamHandlerFactory;
/**
* 自定义类加载器
*/
public class MyClassLoader extends URLClassLoader {
public MyClassLoader(URL[] urls, ClassLoader parent) {
super(urls, parent);
}
public MyClassLoader(URL[] urls) {
super(urls);
}
public MyClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory) {
super(urls, parent, factory);
}
}
打印各个加载器的加载路径
import sun.misc.Launcher;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
public class TestClassLoader {
public static void main(String args[]) throws MalformedURLException {
//类加载器测试
String myFilePath = "C:\\Users\\Administrator\\Desktop\\";
URL[] urls = new URL[1];
urls[0] = new File(myFilePath).toURI().toURL();
//实例化 自己的类加载器
MyClassLoader myClassLoader = new MyClassLoader(urls);
// 打印各个加载器的 加载路径
//1.启动类加载器,加载路径
System.out.println("启动类的加载路径: ");
for(URL url : Launcher.getBootstrapClassPath().getURLs())
System.out.println(url);
System.out.println("----------------------------");
//2.扩展类加载器,加载路径
URLClassLoader urlClassLoaderParent = (URLClassLoader) ClassLoader.getSystemClassLoader().getParent();
System.out.println(urlClassLoaderParent+"扩展类的加载路径: ");
for(URL url : urlClassLoaderParent.getURLs())
System.out.println(url);
System.out.println("----------------------------");
//3.应用类加载器,加载路径
URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
System.out.println(urlClassLoader+"应用类的加载路径: ");
for(URL url : urlClassLoader.getURLs())
System.out.println(url);
System.out.println("----------------------------");
System.out.println(myClassLoader+"自定义类的加载路径: ");
for(URL url : urls)
System.out.println(url);
System.out.println("----------------------------");
}
}
效果截图
从截图效果明显可以看出
启动类加载器(Bootstrap class loader 由C++ 编写,后期分析源码) 加载的文件路径为 jdk 下的 lib目录
扩展类加载器(ExtClassLoader) 加载的文件路径为jdk lib 下的 ext 目录
应用类加载器(AppClassLoader) 加载的为 classpath下的路径,此处可以打开环境变量 就可以看看CLASSPATH的配置
自定义类加载器 加载的是 自定义加载器构成方法传入的指定路径
特别说明:运行此Demo的时候 不要在Idea下允许,不然 AppClassLoader 会打印很多路径,当然这也没什么问题,因为启动类加载器 加载的就是 classpath 下路径,
idea 默认配置了很多classpath 对我们可能会造成一些误会,建议直接 cmd java xxx 运行
附上Idea的 classpath 图
本期主要介绍各个加载器的 加载路径,首先有个初步了解 下期 我们将分别解析每个加载器
END