1

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

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

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

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()( file:lib/jars/swt.jar) 添加罐子后,它只会产生一个NoClassDefFoundError. 是的,我仔细检查了该文件是否存在。

4

2 回答 2

1

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

于 2011-04-26T20:30:21.683 回答
0

作为自定义 ClassLoader 的构造函数的一部分,使用适当的信息调用 definePackage,URL 指向所需的 jar 文件。

此示例显示当我尝试从 swing 实例化一个类时调用自定义类加载器,因为我将我的类加载器定义为该包的加载器。

import java.net.URL;

public class junk extends ClassLoader {

  byte[] dummy = new byte[0];

  public static void main(String[] args) throws Exception {
    new junk();

    new javax.swing.JPanel();

  }

  public junk() throws Exception {
    definePackage("javax.swing","","","","","","",new URL("file://junk.class"));
  }

  public Class<?> findClass(String s) throws java.lang.ClassNotFoundException{
    Class<?> retVal = super.findClass(s);

    System.out.println("delegated responsibility for "+s+" to superclass");

    return retVal;
  }

  public Package getPackage(String s) {
    Package retVal = super.getPackage(s);

    System.out.println("delegated responsibility for "+s+" to superclass");

    return retVal;
  }

}

结果:

将 javax.swing 的责任委托给超类

于 2011-04-26T20:52:41.193 回答