我正在使用自定义类加载器来创建和返回类的实例,这似乎工作正常但是当我尝试调用一个方法(通过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() })
由于确实存在一个接受指定自定义对象的方法,我很难理解导致异常的原因,我已经通过使用反射来列出所有方法来确认这一点。
答案 0 :(得分: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());
}
}