0

カスタムクラスローダーを使用してクラスのインスタンスを作成して返すと、これは問題なく機能するようですが、(Reflection APIを介して)メソッドを呼び出して、以下に説明するようにカスタムオブジェクトを渡そうとすると、次のようになりますNoSuchMethodException

カスタムクラスローダーが次のようなインスタンスを作成して返すと仮定します。

Object obj = customClassLoader.load(String className,Class[] paramTypes,Object[] param)

次に、(リフレクションを介して)メソッドを呼び出し、カスタムオブジェクトを渡します。

注:これはエラーの原因となる行です

Method m = obj.getClass.getDeclaredMethod("mName",new Class[]{aCustomObject.class}) 

m.invoke(obj,new Object[]{new CustomObject() })

指定されたカスタムオブジェクトを取得するメソッドが確実に存在するため、例外の原因となる可能性があることに困惑しています。リフレクションを使用してすべてのメソッドを一覧表示することでこれを確認しました。

4

1 に答える 1

2

カスタム ローダーの load() メソッドは、返されるオブジェクトをどのようにインスタンス化していますか? NoSuchMethodException正しいコンストラクターを見つけようとしているときに発生する可能性がありますか?

この例はうまくいくようです:

package com.pholser;

import java.lang.reflect.Method;

public class ClassLoading {
    public static class CustomLoader extends ClassLoader {
        public Object load(String className, Class<?>[] paramTypes, Object[] params) throws Exception {
            Class<?> loaded = loadClass(className);
            return loaded.getConstructor(paramTypes).newInstance(params);
        }
    }

    public static class ACustomObject {
    }

    public void foo(ACustomObject a) {
        System.out.println("foo");
    }

    public static Object newCustomObject() throws Exception {
        return new CustomLoader().load("com.pholser.ClassLoading$ACustomObject", new Class<?>[0], new Object[0]);
    }

    public static void main(String[] args) throws Exception {
        ClassLoading obj = new ClassLoading();

        Method m = obj.getClass().getDeclaredMethod("foo", ACustomObject.class);

        m.invoke(obj, newCustomObject());
    }
}
于 2012-11-08T22:14:23.107 に答える