当前位置: 首页 > 知识库问答 >
问题:

类装入器的委托模型如何确保装入唯一的类?

白赞
2023-03-14

我曾经读到过Java中类装入器的委托模型的“唯一性”特性:

https://www.baeldung.com/java-classloaders#uniqueness

我不明白,如果没有这样的模型,我们怎么会有加载非唯一类的风险呢?

当类装入器使用完全限定的类名来装入它们时,我们如何才能最终装入重复的类,特别是当我们在将任务委托给父装入器之前检查一个类是否已经装入时?

https://www.baeldung.com/java-classloaders#classloader-work

共有2个答案

尉迟俊能
2023-03-14

假设我们有两个jar文件,每个都包含类< code>com.example.Foo。

假设jar文件由两个不同的类加载器加载,加载器1是加载器2的父级。

无论我们是使用loader1还是使用loader2作为活动类加载器运行,我们都将始终从loader1获取类。第二个jar文件中的类将永远不会被加载,因此保证了唯一性,即,我们在内存中不会有两个同名的类。

仅供参考:Servlet 规范违反了该委托模型,如果它是活动的类装入器,则会从 loader2 装入类。众所周知,这会引起麻烦,特别是对于旧的Apache Commons Logging库(版本1)。

薛经纶
2023-03-14

我们如何结束加载重复的类,特别是当我们在将任务委托给父加载器之前检查一个类是否已经被加载时?https://www.baeldung.com/java-classloaders#classloader-work

类装入器检查类是否已装入的步骤,即方法java.lang.ClassLoader.findLoadedClass,并不意味着唯一性。想象一下两个类装入器 CL1CL2,它们都装入一个类 X。在这种情况下,如果 CL1CL2 之前装入 X,那么 CL2 完成的检查将不会返回 CL1 装入的同一类,因为这些类装入器不会在它们之间共享此信息。

委托模型是通过父类装入器“共享”此信息的模型。

 类似资料:
  • 我有一个简单的自定义ClassLoader 下面是我试图使用加载器的代码: 结果是相当令人期待的: 在大多数文章中,您可以看到,当您在自定义加载程序上调用loadClass时,它首先尝试在其缓存中查找该类。如果找不到,则从父加载程序(在本例中为应用程序加载程序)调用loadClass方法。引导加载程序也是如此。之后,如果引导加载程序在其缓存中找不到该类,它将尝试在相应的源中找到该类。如果加载程序找

  • 我有一个问题,看起来它是因为同时使用了类加载器的两个实例而引起的。计划任务总是运行两次而不是一次,即使设置为避免并发使用。 我如何在运行时唯一地识别给定类实例的类装入器实例?我知道它的完全限定名是类加载器、包和类名的组合。我想知道同一个类装入器的两个实例是否同时运行。 我尝试使用以下日志记录,但它没有给我任何有用的方面,我实际上希望看到什么(相当于一个唯一的线程id等)。是的,它确实给出了类加载器

  • 我有一个,它从

  • 委托 装饰者模式的另一种实现方案是委托。在这种机制下,一个对象可以和另一个对象相关联。比如你在用 UITableView ,你必须实现 tableView(_:numberOfRowsInSection:) 这个委托方法。 你不应该指望 UITableView 知道你有多少数据,这是个应用层该解决的问题。所以,数据相关的计算应该通过 UITableView 的委托来解决。这样可以让 UITable

  • 最近我开始学习类加载器在Java中是如何工作的。以下是我注意到的三点: 点-1:每个类加载器都有一个父类加载器。当类加载器被要求加载类或资源时,它会在尝试加载项本身之前咨询其父类加载器。父级反过来咨询其父级,依此类推。因此,只有当所有祖先类加载器都找不到项时,当前类加载器才会参与其中。 Point-2:同一个类由两个加载器加载,被视为两个不同的类实体。我们甚至不能将一个类(加载器1)对象转换为另一

  • 问题内容: 装饰器模式和委托模式(如果有)之间有什么区别?我不仅想了解实现细节,还不想了解用例差异和如何使用它们的主观观点。 装饰图案 委托模式 编辑: 您能否指向使用这些模式的OS源代码(在OS项目中)(尤其是委托,因为在Java IO类中使用了装饰)。我正在寻找一些实际用法,而不仅仅是虚拟示例。也许这些模式是相同的,只是标题不同。随时写这个意见。 问题答案: 装饰器使用委派,但使用一种非常特定