【问题标题】:Cannot load custom class with URLClassLoader in JavaFX JavaScript无法在 JavaFX JavaScript 中使用 URLClassLoader 加载自定义类
【发布时间】:2013-11-21 21:28:50
【问题描述】:

我正在尝试在 FXML JS 中加载我的自定义类。

首先,我将 URLClassLoader 和我的 JAR 添加到 FXMLLoader 实例中:

FXMLLoader loader = new FXMLLoader();
loader.setController(TabController.this);

URLClassLoader fxmlClassLoader = (URLClassLoader) loader.getClassLoader();
loader.setClassLoader(URLClassLoader.newInstance((URL[]) ArrayUtils.addAll(new URL[]{ new File("/home/sk_/projects/mjolnirr/.hive/static/calculator/origJar.jar").toURI().toURL() }, fxmlClassLoader.getURLs())));

然后在 FXML JavaScript 中:

importClass(com.mjolnirr.sample.SomeTestClass);

失败并出现错误:

sun.org.mozilla.javascript.internal.EvaluatorException: Function importClass must be called with a class; had "[JavaPackage com.mjolnirr.sample.SomeTestClass]" instead. (<Unknown source>#2) in <Unknown source> at line number 2

有人遇到过这种情况吗?

【问题讨论】:

    标签: java javafx-2 javafx fxml


    【解决方案1】:

    好的,我找到了一种破解解决方案there。简而言之 - 我刚刚将我的 URL 动态添加到系统类加载器中,如下所示:

    public static void addURLToSystemClassLoader(URL url) throws IntrospectionException {
        URLClassLoader systemClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
        Class<URLClassLoader> classLoaderClass = URLClassLoader.class;
    
        try {
            Method method = classLoaderClass.getDeclaredMethod("addURL", new Class[]{URL.class});
            method.setAccessible(true);
            method.invoke(systemClassLoader, new Object[]{url});
        } catch (Throwable t) {
            t.printStackTrace();
            throw new IntrospectionException("Error when adding url to system ClassLoader ");
        }
    }
    

    然后在我的渲染方法中

    FXMLLoader loader = new FXMLLoader();
    loader.setController(TabController.this);
    
    try {
        addURLToSystemClassLoader(new URL("hive://" + pageURL.getHost() + ":" + pageURL.getPort() + "/" + pageURL.getApplicationName() + "/origJar.jar"));
    } catch (Exception e) {
        e.printStackTrace();
    }
    

    但这看起来是个坏习惯。

    我认为最初的问题是 - JavaFX 脚本引擎有不同的类加载器,FXML 加载器不会将它自己的传递给脚本引擎。谁知道如何为脚本引擎设置类加载器?

    【讨论】:

      【解决方案2】:

      如何将当前线程加载的类显式设置为新的类加载器?

      例如:

      URL[] urlsForJarFiles = getUrls();
      ClassLoader myClassLoader = new URLClassLoader(urlsForJarFiles, ClassLoader.getSystemClassLoader();
      Thread.currentThread.setContextClassLoader(myClassLoader);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-12
        • 2013-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多