ExtClassLoader加载资源的一此问题

今天深入研究了一下ClassLoader.getResource(name)的方法。发现ExtClassLoader加载资源的一些特殊点。

一、现象

废话不多,先上测试代码与结果,再慢慢分析。

public class ResourceDemo {
    public static void main(String[] args) {

        System.out.println("------------------------------------");
        System.out.println("1:" + Arrays.toString(System.getProperty("java.ext.dirs").split(";")));

        ClassLoader extClassLoader = ResourceDemo.class.getClassLoader.getParent();
        System.out.println("3:" + extClassLoader.getClass().getName());

        URL path = extClassLoader.getResource("/");
        System.out.println("4:" + path);

        URL resource = extClassLoader.getResource(".");
        System.out.println("5:" + resource);

        URL resource1 = extClassLoader.getResource("com/adair");
        System.out.println("6:" + resource1);

        URL resource2 = extClassLoader.getResource("test.txt");
        System.out.println("7:" + resource2);

        URL resource3 = extClassLoader.getResource("sun/net/spi/nameservice/dns");
        System.out.println("8:" + resource3);

        URL resource4 = extClassLoader.getResource("sun/net/spi/nameservice/dns/DNSNameService.class");
        System.out.println("9:" + resource4);
    }
}
---------------运行结果---------------------
1:[D:\Program Files\Java\jdk1.8.0_241\jre\lib\ext, C:\Windows\Sun\Java\lib\ext]
3:sun.misc.Launcher$ExtClassLoader
4:null
5:null
6:jar:file:/D:/Program%20Files/Java/jdk1.8.0_241/jre/lib/ext/my-custom-1.0.jar!/com/adair
7:jar:file:/D:/Program%20Files/Java/jdk1.8.0_241/jre/lib/ext/my-custom-1.0.jar!/test.txt
8:null
9:jar:file:/D:/Program%20Files/Java/jdk1.8.0_241/jre/lib/ext/dnsns.jar!/sun/net/spi/nameservice/dns/DNSNameService.class

众所周知ExtClassLoader加载器是用来加载java的一些库的,它加载时的搜索路径是由java.ext.dirs来决定的,该加载器在加载时不同于其他加载器,它加载时会搜索指定路径下的所有子目录,也就是说它会搜索java.ext.dirs所指定下的所有子目录下的class文件或jar文件。同时也可以用参数-Djava.ext.dirs来改变它的搜索路径。
所以打印出来的当前值是:D:\Program Files\Java\jdk1.8.0_241\jre\lib\ext, C:\Windows\Sun\Java\lib\ext 。因此我在jre\lib\ext路径下添加了自定义jar包。


ext.png

自定义包结构.png

从结果4和5获取ExtClassLoader检索的根目录和当前目录,返回的结果为null。
结果6和7 ExtClassLoader加载器能检索到自定义jar文件的包路径和文件。
结果8和9 ExtClassLoader检索不到JAVA自带的jar文件的包路径,但能检索到文件,这点很是奇怪。

二、猜测

ExtClassLoader 加载有如下限制:
1、只能检索目录下的*.jar文件;
2、不能以绝对地址索引;
3、能检索自定义的jar文件包路径和具体文件;
4、不能检索自带jar文件包路径但能检索具体文件;

你可能感兴趣的:(ExtClassLoader加载资源的一此问题)