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

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(使用前将#替换为@)

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

  • 如何检查 Java 中的间隔列表 (Joda-Time) 是否完全覆盖一个月

    我在用着乔达时间 http www joda org joda time Java 中用于跟踪时间列表的库间隔 http www joda org joda time key interval html 我想检查是否有一个列表Interva
  • Criteria eager fetch-joined 集合以避免 n+1 选择

    假设 Item 和 Bid 是实体 一个 Item 有多个 Bid 它们被映射到休眠在典型的父子关系中
  • 如何在 Android 中恢复我的音频?

    我必须实现用于创建具有暂停和恢复状态的音频的应用程序 当我的应用程序作为启动时音频启动 当我按下模拟器上的后退按钮时 音频音乐处于暂停状态 但是当我的活动回来时从停止状态到前台我的音频音乐未恢复 这是我的代码 public class Au
  • 逐行读取 JTextPane

    有没有办法读取a的内容JTextPane逐行 很像 BufferedReader 吗 Element root textPane getDocument getDefaultRootElement 获得根元素后 您可以检查存在多少个子元素
  • Java - 了解 PrintWriter 和刷新的需要

    好吧 首先我对所有代码表示歉意 但我觉得代码太多总比代码不够好 我正在制作一个简单的聊天客户端和印刷机 尤其是我正在努力解决的问题 使用现在的代码 它将与服务器类交互 并且完美地打印我想要打印的内容 但是 当我删除 writer flush
  • BigDecimal 中 Divide 方法的 Scale()

    new BigDecimal 37146555 53880000 divide new BigDecimal 1000000 scale 这返回10 但根据API divide method 返回一个 BigDecimal 其值为 这个 除
  • AES BadPaddingException

    如果我使用错误的密钥或错误的盐进行解密 则会引发 BadPaddingException 我希望返回一个不正确的字符串 doFinal 导致解密方法出现异常 信息 This is just an example Unfug S F V s
  • 从另一个类添加 Swing 组件

    我正在学习java 我正在尝试从另一个类向我的框架添加一个菜单栏 练习将代码划分为多个类以更好地组织程序 这是我的代码示例 public class MainApp public static void main String args C
  • Android 防火墙与 VpnService

    我正在尝试使用 BS 项目的 VpnService 为 Android 实现一个简单的防火墙 我选择 VpnService 因为它将在非 root 设备上运行 它将记录连接并让您过滤连接 基于IP 有一个应用程序可以做到这一点 因此这是可能
  • Java中的运算符重载和覆盖

    运算符重载和运算符重写有什么区别 它们在继承和控制台程序中是否相同 Java 不支持运算符重载和重写 检查以下引用自的描述 http java sun com docs white langenv Simple doc2 html http
  • Android 上的自定义视图和窗口属性

    我想要做的是在我的应用程序顶部添加一个视图 该视图类似于过滤器视图 我想操纵屏幕的颜色 并且我还希望能够同时更改屏幕的亮度时间 这两件事似乎是分开起作用的 但不能一起起作用 这是我的代码 添加视图 colourView new Layer
  • 在 JSF 自定义验证器中区分 ajax 请求和完整请求

    我的验证器需要知道它是完整请求还是 ajax 请求 在我当前的解决方案中 我检查 http 请求标头X Requested With元素 public void validate FacesContext context UICompone
  • 在 Java/GWT 中解析用户时间输入

    解析用户在 GWT 中的文本字段中键入的时间的最佳方法是什么 默认时间格式要求用户完全按照区域设置指定的时间格式输入时间 我想要更加灵活 因为用户可以通过多种不同的方式输入时间 例如 8 8p 8pm 8 15pm 13 15 1315 1
  • 如何设置 commons-logging 来使用 logback?

    我们使用 slf4j logback 并且碰巧有一些使用 commons logging 的第三方库 如何设置它以使用 logback 答案是不要使用 commons logging jar 因为 SLF4J 的设计目的与 commons
  • 用什么? MVC、MVP 或 MVVM 还是……?

    我将启动一个 Java 项目来开发桌面应用程序 使用什么作为表示层模式 MVC MVP MVVM 或 如果可能的话 举一些可行的小例子 Actually the ultimate post you re looking for is thi
  • 需要同步仅增量计数器吗?

    我使用整数作为计数器 该整数只会增加 并且肯定有多个线程会同时增加它 当没有其他线程尝试访问其值时 在程序执行结束时读取该计数器的值 我假设我不必为这种仅增量计数器使用锁或任何类型的同步 这是正确的吗 如果这有什么区别的话 我用 Java
  • JavaFX 中的 MVC 模式与场景生成器

    我是 JavaFX 新手 根据我当前的设置 正在努力创建合适的 MVC 架构 我使用 Scene Builder 单击了一个 UI 并指定了一个 Controller 类 Startup public class Portal extend
  • Hibernate 命名查询使用 Like 和 % % 运算符?

    在我的 Hibernate JPA 示例代码中 public List
  • 丰富:数据表行跨度问题

    我需要创建一个 rich dataTable 甚至扩展 具有以下功能 我有一个公司类 其中包含产品对象的集合 我想展示下表 我仍然没有弄清楚如何使用子表执行此操作 在所有示例中 我发现子表具有与主表完全相同的列 据推测 我需要在前两列中使用
  • selenium 没有找到合适的方法,直到(ExpectedCondition)

    这是有线的问题 我导入的项目运行 100 几个月前 今天我已将其与依赖项一起导入 但存在问题WebDriverWait 这是我的代码 WebDriverWait driverWait new WebDriverWait driver 100

随机推荐

  • 如何在 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