使用URLClassLoader获取与默认ClassLoader相同的引用

时间:2014-10-04 21:30:14

标签: java classloader urlclassloader

我正在尝试测试一个类可以加载到jvm然后使用不同的ClassLoader 所以我的代码试图加载一个类(类名“Tzvika”)两次 首先使用默认的ClassLoader 并在第二次尝试使用URLClassLoader
问题是我获得了URLClassLoader和默认ClassLoader的相同引用 我做错了什么?

这里代码:

public static void main(String[] args) {
    Tzvika t1 = new Tzvika();
    System.out.println("t1 class loader: " + t1.getClass().getClassLoader());

    Tzvika t2 = null;
    try {
        URLClassLoader clsLoader = URLClassLoader.newInstance(new URL[] {new URL("file:/C://data/workspace/ashrait/tests/SampleClassLoader/bin/com/tzvika/sample/")});
        // same problem when i do this
        //URLClassLoader clsLoader = new URLClassLoader(new URL[] {new URL("file:/C://data/workspace/ashrait/tests/SampleClassLoader/bin/com/tzvika/sample/")});
        Class cls = clsLoader.loadClass("com.tzvika.sample.Tzvika");
        t2 = (Tzvika)cls.newInstance();
        System.out.println("t2 class loader: " + t2.getClass().getClassLoader());

    } catch (Exception e) {
        e.printStackTrace();
    }

}

这是我的控制台输出:

t1 class loader: sun.misc.Launcher$AppClassLoader@1a52fdf
t2 class loader: sun.misc.Launcher$AppClassLoader@1a52fdf

1 个答案:

答案 0 :(得分:0)

创建没有父母的URLClassLoader

URLClassLoader clsLoader = URLClassLoader.newInstance(new URL[] {new URL("file:/C://data/workspace/ashrait/tests/SampleClassLoader/bin/com/tzvika/sample/")}, null);

另请注意,您应指定类路径根目录的路径,即

URLClassLoader clsLoader = URLClassLoader.newInstance(new URL[] {new URL("file:/C://data/workspace/ashrait/tests/SampleClassLoader/bin")});

为了更好地澄清,URLClassLoader州的构造函数

  

将按照为类指定的顺序搜索URL   资源首次搜索指定的父类加载器

因此,当您尝试从此ClassLoader加载一个类时,它将首先检查父类ClassLoader,它是引导类加载器,以确定该类是否存在。由于该父类加载器已经加载了com.tzvika.sample.Tzvika类,因此它将返回它。

现在,由于父类加载器和clsLoader加载的类不同,因此这些类的实例属于不同的类。因此,虽然com.tzvika.sample.Tzvika两个ClassLoader都有ClassLoader,但它们却截然不同。

这是不同{{1}} s。

的重点