gpt4 book ai didi

java - ClassLoader 和 Class.forName()

转载 作者:行者123 更新时间:2023-12-04 05:11:21 26 4
gpt4 key购买 nike

我制作了一个自定义类加载器,但我不知道如何“注册”它。

public static void main( String[] args ) throws Exception {
File jar = new File( "Simple.jar" );
FileInputStream fis = new FileInputStream( jar );
byte[] bytes = new byte[(int)jar.length()];
fis.read( bytes );
fis.close();
MemoryClassLoader cl = new MemoryClassLoader();
cl.defineClasses( bytes );

// 1: Following lines works well
cl.findClass ( "help.Simple" )
.getMethod( "main", new Class[]{ String[].class })
.invoke( null, (Object)args );

// 1: it works well
cl.findClass ( "help.Simple" )
.getMethod( "main", new Class[]{ String[].class })
.invoke( null, (Object)args );

// 2: it works well too
Class.forName( "help.Simple", true, cl )
.getMethod( "main", new Class[]{ String[].class })
.invoke( null, (Object)args );

// 3: it doesn't work
Class.forName( "help.Simple" )
.getMethod( "main", new Class[]{ String[].class })
.invoke( null, (Object)args );
}

实际的 MemoryClassloader 比较复杂,这里不再详述。

该程序输出:
Hello, world!
Hello, world!
Exception in thread "main" java.lang.ClassNotFoundException: help.Simple
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:186)
at loader.MemoryClassLoader.main(MemoryClassLoader.java:76)

“你好,世界!”由 help.Simple.main( String[] args ) 打印.
类 help.Simple 由我的类加载器正确加载。
但是第三种调用方式 Class.forName()不起作用。
为什么以及如何将使用自定义类加载器加载的类添加到默认系统类加载器加载的“标准”类列表中?

最佳答案

Class.forName 默认使用已加载当前类(包含您的主要方法的类)的类加载器。我认为在这种情况下让它工作的唯一方法是使用接受另一个类加载器的重载方法。

当在由您的类加载器加载的其他类中使用时,它应该可以正常工作。

Class.forName( "help.Simple", true, cl )

关于java - ClassLoader 和 Class.forName(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14892116/

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