- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近我开始学习类加载器在 Java 中到底是如何工作的。以下是我观察到的三点:
第一点:每个类加载器都有一个父类加载器。当类加载器被要求加载类或资源时,它会在尝试加载项目本身之前咨询其父类加载器。父级又咨询其父级,依此类推。所以只有在所有祖先类加载器都找不到该项之后,当前类加载器才会介入。
Point-2:由两个加载器加载的同一个类被视为两个不同的类实体。我们甚至不能将一个类(loader 1)对象转换为另一个类(由loader2加载)。它将抛出 ClassCastException。
第三点:子类加载器可以检查父类加载器的缓存,但父类加载器看不到已加载的类 由 child 。
基于以上几点我有两个问题:
情况:我在同一个应用程序中创建了一个 URLClassloader 对象 url1 和另一个 URLClassloader 对象 url2。正如我们所知,默认情况下两个类加载器将具有相同的父类加载器。假设这里的父类加载器是SystemClassLoader。
问题 1: url1 类加载器已从位置 x/abc.jar 加载类 A.class。 url2 再次想要从同一个加载相同的类 地点。 url2 会重新加载还是会使用 url1 加载的相同内容?我尝试检查,只有一次静态 block 被执行,所以相信类只被加载一次。据我了解,这不满足Point-1和Point-3。
问题2:url2类加载器是否可以检查url1类加载器的缓存。与第 3 点相关。
最佳答案
类加载器是完全独立的,因此您可以获得两个不同的类。
由于您没有发布 MCVE (最小、完整和可验证的示例),这是一个使用任意选择的 .jar 文件的示例。
public static void main(String[] args) throws Exception {
String jarFile = "/path/to/commons-lang3-3.8.1.jar";
URLClassLoader url1 = new URLClassLoader(new URL[] { new File(jarFile).toURI().toURL() });
URLClassLoader url2 = new URLClassLoader(new URL[] { new File(jarFile).toURI().toURL() });
Class<?> fractionClass1 = url1.loadClass("org.apache.commons.lang3.math.Fraction");
Class<?> fractionClass2 = url2.loadClass("org.apache.commons.lang3.math.Fraction");
Object oneHalf1 = fractionClass1.getField("ONE_HALF").get(null);
Object oneHalf2 = fractionClass2.getField("ONE_HALF").get(null);
System.out.println("url1 = " + url1);
System.out.println("url2 = " + url2);
System.out.println(" Same? " + (url1 == url2));
System.out.println("fractionClass1 = " + fractionClass1);
System.out.println("fractionClass2 = " + fractionClass2);
System.out.println(" Same? " + (fractionClass1 == fractionClass2));
System.out.println("oneHalf1 = " + oneHalf1);
System.out.println("oneHalf2 = " + oneHalf2);
System.out.println(" Same? " + (oneHalf1 == oneHalf2));
}
输出
url1 = java.net.URLClassLoader@1e81f4dc
url2 = java.net.URLClassLoader@4d591d15
Same? false
fractionClass1 = class org.apache.commons.lang3.math.Fraction
fractionClass2 = class org.apache.commons.lang3.math.Fraction
Same? false
oneHalf1 = 1/2
oneHalf2 = 1/2
Same? false
关于java - java Class-loader loader Hierarchy 中同一级别的两个类加载器(假设都是 URLClassLoader)如何加载一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56070608/
我想使用 URLClassLoader 从 jar 存档中加载特定目录中的类。 项目结构如下 / application.jar /lib/ mysql.jar log4j.jar .
我在一个目录中有多个来自不同包的已编译 Java 类文件,如下所示。 C:/classes/package/A.class C:/classes/package/B.class C:/classes/
我正在使用 URLClassLoader 从外部 jar 文件加载类,由此加载的类可能已经存在于我的 Web 应用程序类加载器中,假设 URL 类加载器已加载版本 1 的类 A 和 Web 应用程序使
我想在目录 F:/badge-dao/bin/com/badge/dao/impl/ 中加载一个名为 BadgeDaoImpl 的文件。我正在编写和测试以下代码。 如果我更改目录或类名,它会抛出异常。
我编写了一个程序来管理以 jar 形式提供的插件。 我使用 URLClassLoader 加载插件类,它按预期工作。我添加了一些存储在插件 jar 中的资源(XML 文件)。 如果我调用不使用资源的方
在我之前的问题中,我询问了如何加载远程 jar 文件。我当前的代码是这样的: //f is the path to the jar URLClassLoader loader = new URLCla
我有一个非常奇怪的问题。 我正在使用 URLClassLoader 从目录中动态导入文件。如果我使用文字字符串,代码可以正常工作,如果我将变量用于文字字符串,代码也可以正常工作,但这不是我需要的。 p
我有相当简单的场景: 我的应用程序具有包含我的应用程序逻辑的核心 jar 文件。这个核心 jar 应该在运行时动态监视文件夹,当插件 jar 被放到那里时,它应该加载它并准备好使用它。可能有很多插件j
所以我正在制作一个服务器,很像 IRC,只是为了了解更多信息,这就是我的问题。 我有每个人都可以根据自己的权限调用的命令,并且每个“命令”都有自己的类,所有类都位于一个目录中。我将所有类加载到 Has
我在互联网上浏览了很多 URLClassLoader 内存泄漏解决方案,但我还没有找到任何完全工作的代码和精确的解决方案。我找到的最接近的解决方案是 this 任何功能齐全的代码或链接,它使用 Wea
我有一个相当复杂的 Java 软件,它必须动态加载一个类、创建一个对象并调用其方法之一。事实证明,在某些情况下,如果加载的类引用了另一个类,则会引发 NoClassDefFoundError(由 Cl
这是我的代码: File folder = /* the folder with a.txt file */ final URL[] urls = new URL[] { folder.toURI
在开发一个 ant 任务以使用注释为项目自动生成一些 gui 代码时,因为我更喜欢声明性方法,所以我使用 java.net.URLClassLoader动态添加类到我的类路径。 当扫描类的类级别注释时
我正在尝试编写一段在运行时动态加载类的代码 public class URLDynClassLoader { public URLDynClassLoader(){ try{
我有一个 java 项目,它使用 URLClassLoader 在运行时从另一个 jar 文件加载类,就像插件系统一样。让我给你一个简化版本的问题:假设在我的 main 方法中,我将创建 ClassL
所以我知道如何使用 URLClassLoader,并且我知道它的作用,我想知道它到底是如何做到的。 基本上我在问:这是直播吗?或者它会临时下载并在本地读取类吗? 因此,如果您不断地从使用 URLCla
我有以下代码片段 URL url = new File("c:/work/projects/jars/").toURI().toURL(); URL[] urls = new URL[]{url};
在哪种情况下,可以使用 URLClassLoader 从指定路径中的特定 jar 加载类? 例如。 URL url = new URL("file:///path/to/customClasses.j
假设我正在创建一些加载外部目录中所有 jar 的东西,以动态向应用程序添加可选功能。 我迭代该目录中的所有 jar 并确认它们是 jar 并将它们作为 URL 加载到 URLCLassLoader 中
我正在尝试编写一个可以从命令行传递任意文件的 Java 1.7 应用程序。该文件将被添加到类加载器中,以便可以将其用作资源。 将文件添加到 URLClassLoader 似乎可行,但是添加到 Clas
我是一名优秀的程序员,十分优秀!