Java загружает внешний класс во время выполнения - PullRequest
2 голосов
/ 28 марта 2012

У меня есть еще одна проблема, ответ которой ускользает от меня.Я хочу взять класс из внешнего 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!"));

Есть идеи?Спасибо!

Ответы [ 2 ]

3 голосов
/ 28 марта 2012

InvocationTargetException генерируется, когда вызванный метод (testMethod в вашем случае) выдает исключение.Из документов:

InvocationTargetException - это проверенное исключение, которое переносит исключение, выданное вызванным методом или конструктором.

Судя по трассировке стека (точнее, "вызванная" -частью), похоже, что testMethod вызывает вызов MenuSingleplayer.LoadWorlds, что вызывает NullPointerException.Это NullPointerException распространяется до тех пор, пока не достигнет отражающего вызова, после чего оно будет заключено в InvocationTargetException.

3 голосов
/ 28 марта 2012

Проблема в методе MenuSingleplayer.LoadWorlds. Там написано, что там произошло NPE. Там нет ничего общего с отражением. Все в порядке:

Caused by: java.lang.NullPointerException
at MenuSingleplayer.LoadWorlds(MenuSingleplayer.java:210)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...