【问题标题】:Java loading an external class in runtimeJava 在运行时加载外部类
【发布时间】:2012-04-11 11:45:28
【问题描述】:

我还有另一个问题,我没有找到答案。我希望在运行时从外部 jar 中获取一个类并从中获取一个方法并将其传递给它一个参数。我下面的代码当前打开 jar 并获取类并运行该方法,但是当我尝试向它传递一个参数时,该方法运行但我得到一个 InvocationTargetException。有什么想法吗?

这是我的代码:

    String path = "test.jar";
    URL[] classes = {new File(path).toURI().toURL()};
    URLClassLoader child = new URLClassLoader (classes, this.getClass().getClassLoader());
    try {
        Class classToLoad = Class.forName("testClass", true, child);
        Method method = classToLoad.getDeclaredMethod ("testMethod", String.class);
        Object instance = classToLoad.newInstance();
        Object result = method.invoke(instance, new String("Test from method!"));
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }

这是它抛出的错误:

Test from method!
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at Load.loadJar(LoadTerrem.java:33)
    at Load.<init>(LoadTerrem.java:18)
    at Load.main(LoadTerrem.java:13)
Caused by: java.lang.NullPointerException
    at MenuSingleplayer.LoadWorlds(MenuSingleplayer.java:210)
    at MenuSingleplayer.setup(MenuSingleplayer.java:89)
    at M0.LoadGame(M0.java:76)
    ... 7 more

如您所见,该方法执行,打印出传递给它的字符串,但随后在该行抛出错误:

Object result = method.invoke(instance, new String("Test from LoadTerrem!"));

有什么想法吗?谢谢!

【问题讨论】:

    标签: java class url methods jar


    【解决方案1】:

    当调用的方法(在您的情况下为testMethod)引发异常时,将引发InvocationTargetException。来自文档:

    InvocationTargetException 是一个经过检查的异常,它包装了由调用的方法或构造函数抛出的异常。

    从您的堆栈跟踪(确切地说是“由”部分)判断,testMethod 导致MenuSingleplayer.LoadWorlds 被调用,从而引发NullPointerException。这个NullPointerException 向上传播,直到它到达反射调用,此时它被包裹在InvocationTargetException 中。

    【讨论】:

      【解决方案2】:

      问题出在 MenuSingleplayer.LoadWorlds 方法中。它说那里发生了NPE。与反思无关。没关系:

      Caused by: java.lang.NullPointerException
      at MenuSingleplayer.LoadWorlds(MenuSingleplayer.java:210)
      

      【讨论】:

      • 嗯,我现在感觉有点……愚蠢。谢谢,虽然你解决了!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 2013-12-23
      相关资源
      最近更新 更多