gpt4 book ai didi

java - 显式加载 - java.lang.ClassLoader

转载 作者:行者123 更新时间:2023-12-02 12:14:18 24 4
gpt4 key购买 nike

在第一种情况下,显式加载 test.ClassLoaderTest使用下面的代码,

public ClassLoaderTest{
public static void main(String[] args){
.....
Class.forName("test.ClassLoaderTest", true,
ClassLoaderTest.class.getClassLoader().getParent());
....
}

findClass()方法Launcher$ExtClassLoader调用实例来加载 test.ClassLoaderTest由于可见性原理,出现以下错误,

java.lang.ClassNotFoundException: test.ClassLoaderTest
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at sun.misc.Launcher$ExtClassLoader.findClass(Launcher.java:229)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at test.ClassLoaderTest.main(ClassLoaderTest.java:29)
<小时/>

在第二种情况下,显式加载 test.ClassLoaderTest1 ,使用

public ClassLoaderTest{
public static void main(String[] args){
.....
Class.forName("test.ClassLoaderTest1");
....
}

loadClass()方法Launcher$AppClassLoader实例最终用于加载test.ClassLoaderTest1类,

哪里test.ClassLoaderTest1是一个错误的类文件,导致以下错误,

java.lang.ClassNotFoundException: test.ClassLoaderTest1
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at test.ClassLoaderTest1.main(ClassLoaderTest.java:16)
<小时/>

在这两种情况下,类加载工作都是由java.net.URLClassLoader.findClass()完成的。

<小时/>

Class.forName()内部调用getClassLoader()了解已经加载该类的类加载器。

在第二种情况下,当 Class通过调用获取类加载器实例(类型为 Launcher$AppClassLoader) ClassLoader cl = getClassLoader0();再次调用类加载器实例。

java.lang.ClassLoader主要用于子类化自定义类加载器?加载 CLASSPATH 中不可用但来自网络源等的类...

最佳答案

来自 Javadoc,

public **abstract** class ClassLoader
extends Object

有不同的 ClassLoader 实现,它们使用不同的策略来定位和读取组成类的字节流。

关于java - 显式加载 - java.lang.ClassLoader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46309118/

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