Java 类加载器和依赖解析

2024-03-09

有人可以澄清一下,类加载器的作用不仅是加载单个类,而且还加载其依赖项吗?如果是这样,整个过程到底需要什么?如果可能的话,我正在寻找实施细节。

例如,在某些时候,必须从某个地方(网络或文件系统位置)读取字节,并且必须根据类规范名称和类的预知来计算文件系统位置JVM 可用的路径 - 单个类加载器如何尝试在潜在的多个类路径上定位文件?它从哪里获取这些信息?另外,什么时候对类文件进行字节验证并检查其依赖项的可用性?

尽可能详细,我们将不胜感激:)


类加载是一个非常复杂的主题。 ClassLoader 和 Java 安全模型密不可分。本质上,JVM 按需加载类。当存在类加载器层次结构时,JVM 会尝试尽可能沿链向下解析类。简而言之,如果该类是在“引导”类加载器和应用程序定义的类加载器中定义的,则它将始终使用引导类加载器中的版本。

在类加载器(例如 URLClassLoader)中,搜索顺序是您告诉它查找的顺序。本质上,您告诉它有类的 URL 数组将从第一个条目到最后一个条目进行搜索。

当您定义的类引用另一个类时,也会使用相同的算法解析该类。但这里有一个问题:它只解决相对于它被发现的位置的问题。让我们考虑这样一个场景:类 SomeCoolThing 位于引导类加载器中,但依赖于 SomeLameThing,后者位于应用程序定义的类加载器中。该过程如下所示:

App-ClassLoader: resolveClass("SomeCoolThing")
    parent->resolveClass("SomeCoolThing")

Boot-ClassLoader (the ultimate parent): resolveClass("SomeCoolThing")
    SomeCoolThing needs SomeLameThing
    resolveClass("SomeLameThing") // Can't find SomeLameThing!!!!

尽管 SomeLameThing 位于您请求 SomeCoolThing 的类加载器中,但 SomeCoolThing 已在不同的类加载器中解析。另一个类加载器不知道子类加载器,并尝试自行解决它,但失败了。

我很久以前有一本书,非常深入地介绍了 Java 类加载器,我推荐它。它是O'Reilly Media 的 Java 安全性 http://oreilly.com/catalog/9781565924031。它将回答您在处理类加载器及其工作原理时不想知道但仍然需要知道的每一个问题。

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

Java 类加载器和依赖解析 的相关文章

  • HashMap不写入数据库

    我尝试在我的数据库中写入 但只写入发件人和消息 我不明白为什么会发生这种情况 我认为问题出在我使用 sendMessage 的地方 我认为问题是我没有什么可以做的读 写其他用户的主键 我在数据库中写入消息的活动 public class M
  • 无法解析类型为 xxx 的任何 bean;限定符:[@javax.enterprise.inject.Any()]

    我有一个 LoginProvider 接口 public interface LoginProvider boolean login String username String password 以及两种不同的实现 public clas
  • 使用 GWT CellTableBuilder 构建树表

    Is it possible to build a tree table like this http www sencha com examples ExamplePlace basictreegrid with the new Cell
  • 如果在睡眠线程上调用interrupt()会发生什么?

    我有一个线程 然后run I call sleep 如果我中断这个线程会发生什么 MyThread extends Thread public void run try sleep 1000000 catch InterruptedExce
  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • 如何在 JSP 中导入类?

    我是一个完全的JSP初学者 我正在尝试使用java util List在 JSP 页面中 我需要做什么才能使用除以下类之外的类java lang 使用以下导入语句进行导入java util List 顺便说一句 要导入多个类 请使用以下格式
  • 如果使用的 JVM 是 x86 或 x64,则以不同的方式解决 Maven 依赖关系?

    我设置了一个 Maven 存储库来托管一些 dll 但我需要我的 Maven 项目根据使用的 JVM 是 x86 还是 x64 下载不同的 dll 例如 在运行 x86 版本 JVM 的计算机上 我需要从存储库下载 ABC dll 作为依赖
  • 如何在android中设置多个闹钟,在这种情况下最后一个闹钟会覆盖以前的闹钟

    我正在开发一个Android应用程序 用户可以在其中设置提醒时间 但我在以下代码中遇到一个问题 即最后一个警报会覆盖之前的所有警报 MainActivity java public void setreminders DatabaseHan
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • Git 无法识别重命名和修改的包文件

    我有一个名为的java文件package old myfile java 我已经通过 git 提交了这个文件 然后我将我的包重命名为new所以我的文件在package new myfile java 我现在想将此文件重命名 和内容更改 提交
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • Cloudfoundry:如何组合两个运行时

    cloundfoundry 有没有办法结合两个运行时环境 我正在将 NodeJS 应用程序部署到 IBM Bluemix 现在 我还希望能够执行独立的 jar 文件 但应用程序失败 APP 0 bin sh 1 java not found
  • 解析输入,除了 System.in.read() 之外不使用任何东西

    我很难找到具体的细节System in read 有效 也许有人可以帮助我 似乎扫描仪会更好 但我不允许使用它 我被分配了一个任务 我应该以 Boolean Operator Boolean 的形式读取控制台用户输入 例如T F 或 T T
  • 对象锁定私有类成员 - 最佳实践? (爪哇)

    I asked 类似的问题 https stackoverflow com questions 10548066 multiple object locks in java前几天 但对回复不满意 主要是因为我提供的代码存在一些人们关注的问题
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或
  • Java:多线程内的 XA 事务传播

    我如何使用事务管理器 例如Bitronix http docs codehaus org display BTM Home JBoss TS http www jboss org jbosstm or Atomikos http www a
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • Java &= 运算符应用 & 或 && 吗?

    Assuming boolean a false 我想知道是否这样做 a b 相当于 a a b logical AND a is false hence b is not evaluated 或者另一方面 这意味着 a a b Bitwi
  • 嵌入式 Jetty - 以编程方式添加基于表单的身份验证

    有没有一种方法可以按如下方式以编程方式添加基于表单的身份验证 我用的是我自己的LdapLoginModule 最初我使用基本身份验证并且工作正常 但现在我想在登录页面上进行更多控制 例如显示徽标等 有没有好的样品 我正在使用嵌入式 jett

随机推荐

  • Wamp 3.1.3 Windows 环境路径冲突 [重复]

    这个问题在这里已经有答案了 我刚刚安装了Wamp 3 1 3 然后安装了composer 作曲家将 php exe 的路径添加到 Windows 环境变量中 但现在 Wamp 在上下文菜单中显示错误 单击时会显示以下消息 有错误 有Wamp
  • 使用凭据将文件复制到远程服务器时使用 PowerShell 命令出错

    PS C Windows system32 gt Copy Item ToSession s C Programs temp test txt Destination C Programs temp test txt Copy Item 找
  • Powershell - 本地凭据验证

    我利用了Powershell 检查本地管理员凭据 https stackoverflow com questions 10431964 powershell to check local admin credentials作为此代码片段的基
  • 无法重新声明块作用域变量“ngDevMode”

    我的应用程序在 Angular 5 上 这是 package json 的样子 name myapp version 0 0 0 license MIT scripts ng ng start ng serve build ng build
  • 如何在给定缩小文件的情况下找到 D3 的确切版本?

    我使用的遗留系统使用了大量 D3 不幸的是 几年前将我们的缩小版 d3 js 提交到 repo 的人没有记录它是什么版本 所以现在我试图准确地找到它是什么版本 这样我就可以让它与 webpack 很好地配合 并且评估需要做什么才能升级 D3
  • 使用 v-if 时,vue.js 是否不会触发 img 的加载事件?

    我想为社交登录的用户提供必要时注销的机会 为此 如果添加一个调用注销 url 的 img 则注销完成后我想删除按钮 但不会触发 img 的加载 这里发布了一个类似的问题here https github com vuejs vue issu
  • 批量处理AWS Lambda消息

    我想知道一些事情 但我确实找不到相关信息 也许这不是要走的路 但我只是想知道 这是关于 Lambda 批量工作的 我知道我可以设置 Lambda 来使用批量消息 在我的 Lambda 函数中 我迭代每条消息 如果一条消息失败 则 Lambd
  • 如何从一个本地分支“拉”到另一个分支?

    这听起来很简单 但我就是想不出来 我不久前创建了一个实验分支 现在我想提取自创建以来 master 上发生的所有更改 这都是本地的 我想从本地 master 拉取到本地 my branch 但我做不到 这似乎不起作用 告诉我 master
  • 如何在 Vue 3 中添加对全局组件的类型支持?

    所以我有Component1
  • python计算csv列中唯一元素的数量

    我正在尝试使用 Python 获取 csv 列中唯一项目的计数 示例 CSV 文件 没有标题 AB asd AB poi AB asd BG put BG asd 到目前为止我已经尝试过了 import csv from collectio
  • 在pymysql中选择查询

    当执行以下命令时 import pymysql db pymysql connect host localhost port 3306 user root cur db cursor print cur execute SELECT Par
  • Firefox 16 中基于浏览器的 YouTube 上传意外中止

    我有一个常规的基于 YouTube 浏览器的上传表单 如下所示 它在 IE Chrome 和旧版本的 Firefox 中运行良好 然而 我的 Firefox 16 0 2 只是挂在 POST 上 我已在其他装有 Firefox 16 x 的
  • 覆盖ZK中的“处理”

  • AppInjector get 已弃用,请使用 Type 或 InjectionToken

    我试图摆脱这个 tslint 警告 警告 get 已被弃用 从 v4 0 0 开始使用 Type 或 注入令牌 我的代码设置方式是这样的 应用程序注入器 ts import Injector from angular core export
  • 在排序数组中搜索的严格较低时间复杂度界限是多少

    例如 在排序中 紧下界是 N log N 其中 N 是数组的大小 在排序数组中搜索怎么样 我认为是 log N 但我不是 100 确定 而且一切都基于比较 除了输入数组本身之外不能使用任何其他外部存储器 提前致谢 是 仅使用比较在排序数组中
  • 学说:计算有条件的实体的项目

    如何在 Doctrine 中计算具有条件的实体的物品 例如 我意识到我可以使用 usersCount dm gt getRepository User gt count 但这只会计算所有用户 我只想计算那些拥有员工类型的人 我可以做类似的事
  • 验证 Azure Active Directory 中的用户;不使用 SSO,但使用用户名和密码

    随着最近发布的 Azure AD 我们希望使用 Azure AD 进行 Web 应用程序身份验证 但不想使用 SSO 我们不希望用户被重定向到 Microsoft 帐户登录屏幕 然后再返回 我们希望向他们提供登录凭据屏幕 在其中捕获他们的用
  • 如何在 Java GUI 上添加多行标签?

    我做了一个java swing GUI 现在我想在其上显示一条静态消息 但该消息是多行的 而 JLabel 是单行的 我怎样才能显示该消息 我们可以设置 JLabel 的任何属性来显示多行消息吗 我是否必须对多行使用多个 JLabel 还有
  • 词典排序

    我正在做一个问题 说 连接单词以生成字典顺序最低的可能字符串 来自一场比赛 以这个字符串为例 jibw ji jp bw jibw 实际输出结果是 bw jibw jibw ji jp 当我对此进行排序时 我得到 bw ji jibw ji
  • Java 类加载器和依赖解析

    有人可以澄清一下 类加载器的作用不仅是加载单个类 而且还加载其依赖项吗 如果是这样 整个过程到底需要什么 如果可能的话 我正在寻找实施细节 例如 在某些时候 必须从某个地方 网络或文件系统位置 读取字节 并且必须根据类规范名称和类的预知来计