【问题标题】:NoSuchMethodException for methods using custom data type使用自定义数据类型的方法的 NoSuchMethodException
【发布时间】:2020-04-10 19:29:41
【问题描述】:

每当使用 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();

【问题讨论】:

    标签: java reflection urlclassloader


    【解决方案1】:

    您正在调用没有任何对象的方法(invoke 的空参数)。这意味着该方法应该是静态的。

    如果您的方法不是静态的,那么您首先需要使用getConstructors() 创建一个algClass 类型的实例,并将该对象传递给invoke 调用的第一个参数。

    【讨论】:

    • 你说得对,我更新了问题中的代码。我只是在复制代码块时错过了键入代码块。它现在已修复,但仍然有相同的错误。
    • 它是在调用行还是在此之前崩溃?您可以发布堆栈跟踪吗?
    【解决方案2】:

    我的猜测是,您的 UrlClassLoader 获取的 ProcessingData 由不同的类加载器加载,而不是您在发布的 sn-p 中执行的代码。回想一下,就 JVM 而言,通过不同的类加载器加载的类是不同的类。

    【讨论】:

    • 我认为你可能是对的。我怎样才能确保它们是相同的?
    • @Ben 这是一个相当复杂的主题。简而言之,您必须确保不使用多个类加载器加载相同的类(来自相同或不同的 jar)。如果没有更多关于如何组织加载器的详细信息,很难说更多(从您的代码中我可以看到您的 URLClassLoader 使用 AlgorithmLoader 类的 ClassLoader 作为其父类,这意味着您具有非平凡的类加载器层次结构)。
    • @Ben 作为第一次尝试,使用ProcessingData.class.getClassLoader() 而不是AlgorithmLoader.class.getClassLoader() 作为父加载器...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多