NoSuchMethodException для методов, использующих пользовательский тип данных - PullRequest
0 голосов
/ 10 апреля 2020

Всякий раз, когда динамически загружается класс с использованием URLClassLoader, я получаю NoSuchMethodException при попытке выполнить метод с пользовательским типом данных в качестве параметра. Он находит методы со стандартными типами, такими как String и int, но не с пользовательским типом.

Загруженный класс:

public void execute(ProcessingData data){

    System.out.println("entered execute(ProcessingData data");

Класс вызова:

URLClassLoader loader =
        new URLClassLoader(new URL[] {new File(alg.getPath()).toURI().toURL()}, AlgorithmLoader.class.getClassLoader());

    // Load class into memory
    Class<?> algClass = Class.forName(className, true, loader);
    logger.logInfo("Loaded class. Attempting to invoke execute(data) on aircraft: "+ data.getFlightData().getAircraftId());
    Method processMethod = null;

    try {
      Object obj = algClass.newInstance();
      processMethod = algClass.getDeclaredMethod("execute", ProcessingData.class);
      processMethod.invoke(obj, data);
    } catch (final NoSuchMethodException exception) {
      logger.logInfo(exception.toString());
    }
    loader.close();

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

Полагаю, ваш UrlClassLoader получает ProcessingData, загруженный загрузчиком классов, отличным от исполняемого вами кода в опубликованном фрагменте. Напомним, что классы, загружаемые через разные загрузчики классов, являются разными классами в отношении JVM.

0 голосов
/ 10 апреля 2020

Вы вызываете метод без какого-либо объекта (нулевой параметр invoke). Это означает, что ожидается, что метод будет иметь статус c.

Если ваш метод не является статусом c, то сначала вам нужно создать экземпляр типа algClass с использованием getConstructors() и передать этот объект к первому параметру вызова invoke.

...