类加载器如何加载清单类路径中的类引用?

2023-11-25

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

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

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

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

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


简而言之,该实施是 Sun 内部工作的一部分,不能通过公共方式实现。getURLs()只会返回传入的 URL。有一个更长的答案,但只适合大胆的人。

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

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

如果您确实有动力这样做(不推荐),您可以访问此地图:

        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);

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

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}

奇怪的是,这似乎与URLClassLoader 的 JDK:

默认情况下加载的类仅授予以下权限 访问创建 URLClassLoader 时指定的 URL。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类加载器如何加载清单类路径中的类引用? 的相关文章

  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分

随机推荐

  • 如何在 iPhone 的 Objective-C 中以编程方式调整图像大小

    我有一个应用程序 可以在很小的空间中显示大图像 这些图像相当大 但我仅以 100x100 像素帧显示它们 由于我使用的图像大小 我的应用程序响应缓慢 为了提高性能 如何使用 Objective C 以编程方式调整图像大小 请找到以下代码 U
  • 枚举的 rawValue 属性无法识别

    我正在使用 Xcode 6 的 Playground 来尝试 Swift 中的枚举 enum Rank String case One One Two Two init rawValue String self rawValue rawVa
  • 创建 Pandas 滚动窗口系列数组

    假设我有以下代码 import numpy as np import pandas as pd x np array 1 0 1 1 1 2 1 3 1 4 s pd Series x index 1 2 3 4 5 这会产生以下结果s 1
  • Python-pandas 将 NA 替换为数据框中一组的中位数或平均值

    假设我们有一个 df A B apple 1 0 apple 2 0 apple NA orange NA orange 7 0 melon 14 0 melon NA melon 15 0 melon 16 0 要替换 NA 我们可以使用
  • 如何防止Gson将整数表示为浮点数

    当我尝试将字符串转换为 json 时 Gson 有一些奇怪的行为 下面的代码将字符串草稿转换为 json 响应 有没有办法阻止 gson 将 0 添加到所有整数值 ArrayList
  • google-api-java-client NetHttpTransport 导致 NoClassDefFoundError

    我刚刚开始研究Android上的google api java client 将接下来的 3 个库添加到项目中 我不使用 Maven google api client 1 4 1 beta jar google api client go
  • Emacs/CEDET。多个项目和代码完成

    我已经使用 CEDET 1 0 和 ECB 2 40 设置了 emacs 23 1 50 1 很大程度上受到 Alex Otts 设置的启发 http github com alexott emacs configs blob master
  • CSS:-webkit-mask-image

    我正在使用 CSS 属性 webkit mask image 在图像上应用蒙版 但是 在 Chrome 中 当您将图像滚动到页面之外时 遮罩会移动 如何防止面罩移动 还是渲染神器 JSFiddle http jsfiddle net DZT
  • Scala 中不明确的导入

    我正在用 Scala 编写一个小型模拟程序 它是基于演员的 所以我创建了一个文件messages scala包含系统中所有有效的消息 除此之外 我还有一个管理组件 management scala以及定义节点和链接类的文件nodes sca
  • 在 GCP Cloud Run/Function 上使用固定公共 IP(列入白名单)

    我正在寻找将应用部署到 GCP 的最佳方法 该应用程序需要使用微服务 在Cloud Run或Cloud Function上运行 在远程数据库上执行SQL代码 基本上 微服务接收一段 SQL 代码 并需要在远程数据库上执行它 出于安全原因 远
  • 给 CSS 样式的 div 一个“border-left-image”

    只是想给网站上的主要内容 div 的左侧和右侧添加边框 我不想为每个边框设置单独的 div 而是使用border left imageCSS3 中的功能可以实现这一目标 我的代码如下 content background color 7FC
  • 将 Roslyn 编译器与 Visual Studio 2013 结合使用

    有没有办法将 Roslyn 编译器与 Visual Studio 2013 一起使用 以便我可以利用新的 C 6 功能 注意 不能使用 VS 2015 Yes 您可以使用 Visual Studio 2013 编译 C 6 代码 您只需安装
  • 斐波那契递归函数如何“工作”?

    当我读到描述函数递归的一章时 我是 Javascript 的新手 正在阅读它 它使用示例函数来查找斐波那契数列的第 n 个数字 代码如下 function fibonacci n if n lt 2 return 1 else return
  • 考虑添加 android:paddingStart="25dp" 以更好地支持从右到左布局错误

    我最近下载了一个新的ADT 每次保存我的项目后 它都会显示以下内容XML错误 但当我清理它时 同样的情况就会消失 有没有永久的解决方案 提前致谢
  • Ruby:从块中产生块?

    是否有可能lambda proc method或红宝石中其他类型的块 以屈服于另一个块 就像是 a lambda puts in a yield if block given a call puts in a s block 这不起作用 它
  • 每个块的 CUDA 线程限制

    为什么我不能使用 max ofMax dimension size of a thread block x y z 1024 1024 64 如果我使用 1024 1024 它不起作用 当我使用时 32 32 or 1 1024 等等它有效
  • Android FirebaseAuth.getCurrentUser() 从不为空

    我有一个 DispatchActivity 作为我的 Launcher Activity 其目的是检查当前是否有用户登录 如果用户已登录 我会将其发送到他们的 ProfileActivity 否则 我将它们发送到 LogInActivity
  • 动态查询 sqlalchemy 中的列子集

    假设表中只需要两列 名称和 ID 我会编写如下代码 session query User id User name all 但如果列名是动态的 def get data table columns return session query
  • C++:数组的构造函数初始化列表?

    我有一个基本问题 我有一个带有数据成员的类 double mydata N N 是模板参数 使用构造函数初始化列表将这些数据初始化为零的语法是什么 是 mydata 0 根据 C 标准 对于所有编译器也是如此 可以吗 非常感谢 不 在 C
  • 类加载器如何加载清单类路径中的类引用?

    我使用 Maven 构建了一个带有外部类路径添加的 jar添加类路径 当我使用运行该罐子时java jar artifact jar它能够从该主 jar 和 libs 目录中的所有 jar 加载类 但是如果我询问系统属性java class