4

このコードを使用して、オブジェクトからメソッドを抽出しようとしています:

Method[] methods = instance.getClass().getMethods();

for (Method m : methods) {
    System.out.println(">>> " + m.getName());
    for (Class c : m.getParameterTypes()) {
        System.out.println("\t->>> " + c.getName());
    }
}

Object method = instance.getClass().getMethod("initialize", ComponentContext.class);

次の出力を出力します。

>>> initialize
->>> org.hive.lib.component.ComponentContext
java.lang.NoSuchMethodException: org.hive.sample.Calculator.initialize(org.hive.lib.component.ComponentContext)
at java.lang.Class.getMethod(Class.java:1624)
at org.hive.container.lib.Component.hasRightParent(Component.java:140)
at org.hive.container.lib.Component.<init>(Component.java:118)
at org.hive.container.lib.ComponentController$AppLoader.execute(ComponentController.java:107)
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)

元のソース コード:

class Calculator {
    @Override
    public void initialize(ComponentContext context) {
        //  Do nothing
    }
}

どうしたの?

追加:取得方法を次のように変更しました:

Object method = instance.getClass().getMethod("initialize", org.hive.lib.component.ComponentContext.class);

しかし、例外はまだ表示されます

追加 2: instanceオブジェクトは JCL を使用して JAR からインスタンス化されました。これが問題でしょうか?

4

1 に答える 1

3

ComponentContext渡されたクラスgetMethod()は、別のクラスローダーによってロードされた場合、コードによってダンプされたものと (JVM から見て) 同一ではない可能性があります。念のため、関連するクラスローダーが等しいかどうかを確認してください。

これは Java に似ており、両方のクラスがまったく同じ場合にクラス キャスト例外が発生します。

于 2013-10-13T16:24:02.820 に答える