gpt4 book ai didi

Java:自动自定义类加载器

转载 作者:太空宇宙 更新时间:2023-11-04 08:38:49 24 4
gpt4 key购买 nike

我的应用程序使用标准窗口小部件工具包 (SWT) 作为其 GUI。我的问题是 32 位 SWT 库无法在 64 位 JVM 上运行。但我不想让人们在获取软件时选择正确的架构。因此,我想捆绑 32 位和 64 位库,并在运行时自动检测架构。我发现我可以获得 JVM 的正确架构,如下所示:

if (System.getProperty("os.arch").contains("64")) {
// ...
}

现在剩下的就是加载 jar 了。但问题是,我发现的所有示例都要求您在使用之前手动加载该类。

Class.forName("MyClass", false, myClassLoader);

所以我的问题是,是否可以“注册”我的类加载器,这样我就不必事先加载类?

<小时/>

更新:我创建了自己的子类 URLClassLoader并使用命令行参数 -Djava.system.class.loader 将其设置为默认类加载器;但我收到此错误:

Error occurred during initialization of VM
java.lang.Error: java.lang.NoSuchMethodException: com.program.LibraryLoader.<init>(java.lang.ClassLoader)
at java.lang.ClassLoader.initSystemClassLoader(Unknown Source)
at java.lang.ClassLoader.getSystemClassLoader(Unknown Source)

我认为LibraryLoader.<init>引用构造函数...但它就在那里( public LibraryLoader(URI[] urls) )。

<小时/>

更新 2: 差不多到了,JVM 就开始运行了。我添加了这个构造函数以使其工作:

public LibraryLoader(ClassLoader classLoader) {
super(new URL[0], classLoader);
}

但是在使用 addPath() 添加 jar 之后( file:lib/jars/swt.jar ),它只产生 NoClassDefFoundError 。是的,我仔细检查了该文件是否存在。

最佳答案

您可以尝试通过“java.system.class.loader”属性注入(inject)自定义类加载器(请参阅 ClassLoader#getSystemClassLoader)。不过,我建议使用 OSGi 并让框架完成复杂的工作。

关于Java:自动自定义类加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5796012/

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