gpt4 book ai didi

java - 类加载器如何加载 list 类路径中的类引用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:48:30 24 4
gpt4 key购买 nike

我使用 maven 使用 addClasspath 构建了一个带有外部类路径添加的 jar .

当我使用 java -jar artifact.jar 运行该 jar 时,它能够从该主 jar 和 libs 目录中的所有 jar 加载类。

但是,如果我询问系统属性 java.class.path,它只会列出主 jar。如果我向系统类加载器询问它的 url (ClassLoader.getSystemClassLoader().getURLs()),它也只会返回主 jar。如果我向某个库中包含的任何类询问其类加载器,它将返回系统类加载器。

系统类加载器如何加载这些类?

它必须对这些库有一些了解才能从中加载类。有没有办法向它请求这种“扩展的”类路径?

最佳答案

简短的回答是,实现是 Sun 内部工作的一部分,无法通过公共(public)方式获得。 getURLs() 只会返回传入的 URL。有一个更长的答案,但它只是为了大胆。

使用调试器单步执行 Oracle JVM 8 使我完成了与 OpenJDK6 几乎相同的结构,您可以看到它加载类路径的位置 here .

基本上,类加载器会保留一堆尚未解析到内存中的 URL。当要求加载一个类时,它会将 URL 从堆栈中弹出,将它们作为类文件或 jar 文件加载,如果它们是 jar 文件,它将读取 list 并将类路径条目压入堆栈。每次它处理一个文件时,它都会将加载该文件的“加载器”添加到加载器映射(如果没有别的,以确保它不会多次处理同一个文件)。

如果你真的有动力去做(不推荐)你可以访问这张 map :

        Field secretField = URLClassLoader.class.getDeclaredField("ucp");
secretField.setAccessible(true);
Object ucp = secretField.get(loader);
secretField = ucp.getClass().getDeclaredField("lmap");
secretField.setAccessible(true);
return secretField.get(ucp);

在我有引用 external.jar 的 dummy-plugin.jar(在 dummy-plugin.jar 的 list 中)的虚拟设置上运行它,我得到以下信息:

1) 创建类加载器后立即(加载任何类之前):

urlClassLoader.getURLs()=[file:.../dummy-plugin.jar]
getSecretUrlsStack=[file:.../dummy-plugin.jar]
getSecretLmapField={}

2) 从 dummy-plugin.jar 加载类后:

urlClassLoader.getURLs()=[file:.../dummy-plugin.jar]
getSecretUrlsStack=[file:.../external.jar]
getSecretLmapField={file:.../dummy-plugin.jar=sun.misc.URLClassPath$JarLoader@736e9adb}

3) 从 external.jar 加载类后:

urlClassLoader.getURLs()=[file:.../dummy-plugin.jar]
getSecretUrlsStack=[]
getSecretLmapField={file:.../dummy-plugin.jar=sun.misc.URLClassPath$JarLoader@736e9adb, file:.../external.jar=sun.misc.URLClassPath$JarLoader@2d8e6db6}

奇怪的是,这似乎在 JDK for URLClassLoader 的面前飞来飞去。 :

The classes that are loaded are by default granted permission only to access the URLs specified when the URLClassLoader was created.

关于java - 类加载器如何加载 list 类路径中的类引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25729319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com