gpt4 book ai didi

java - Java 类加载器何时参与?

转载 作者:太空狗 更新时间:2023-10-29 22:41:17 25 4
gpt4 key购买 nike

关于什么 Java 类加载器,以及如何/*为什么*编写您自己的类加载器,有 1000 万篇文章和文档......但它们似乎都是假设一些我找不到简单答案的事情!

我理解类加载器的工作:读取字节码并从中构造一个对象。不同的类加载器以不同的方式执行此操作,等等。

但是我从来没有在自己的代码中针对类加载器 API 进行编码,也从来没有编写过自己的代码,所以我很难理解什么时候 ClassLoader'自己的代码实际上会触发。

例如:

public static void main(String[] args) {
Fizz fizz = new Fizz();
fuzz.buzz();
}

在这里,我们有一个 Fizz 对象。在实例化 Fizz 之前,我们需要一个类加载器来启动并将 Fizz.class 加载到它的缓存中。 这发生在何时何地?!?!它没有明确地出现在我的代码中,所以它一定隐含在 JRE 的某个地方......?

与该问题相关,如果我编写自己的类加载器,例如 WidgetClassLoader 并希望将其配置为加载我所有应用程序的类,或者可能只是我的 Fizz.class,我如何将这个 WidgetClassLoader“绑定(bind)”到我的应用程序中,以便它知道要使用哪个类加载器?我的代码需要显式调用这个类加载器还是像第一个示例那样隐式调用?提前致谢!

最佳答案

你的问题并不像你现在想的那么微不足道。

您的 Fizz 示例:Fizz 什么时候加载?这是在 JLS (Chapter 5.4: Linking) 中定义的.它没有定义何时加载 Fizz,但它保证了可见行为。对于 'when' 部分,如果找不到 Fizz,将从第一个访问 Fizz 的语句(Fizz fizz = new Fizz())抛出 Exception。我很确定在这种情况下它会是新的 Fizz(),因为首先计算表达式的右侧。如果你是这样写的:

Fizz fizz = null;
fizz = new Fizz();

在这种情况下,Fizz fizz = null 已经抛出异常,因为它是对 Fizz 类的第一次访问。

谁加载 Fizz?当必须加载一个类时,“属于”需要该类的代码的类加载器用于获取该类。在 Fizz 示例中,这将是使用 main 方法加载类的类加载器。当然,类加载器如果不能自己加载Fizz,也可以选择委托(delegate)给父类加载器。

如何让 JVM 使用我的类加载器?有两种方式,显式或隐式。明确地说:您可以通过调用类加载器的方法来加载类。隐含地:当你从一个已经从你的类加载器加载的类中执行代码(意味着方法或初始化器)并且需要在这个过程中解析类引用时,你的类加载器将被自动使用,因为它是加载代码的类加载器第一名。

关于java - Java 类加载器何时参与?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11545067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com