2012-11-08 35 views
0

我正在使用自定义类加载器来创建并返回一个类的实例,但是当我尝试调用一个方法(通过Reflection API)并且传入自定义对象如下面我描述了得到一个NoSuchMethodException通过反射在类加载器之间传递参数API

假设自定义类装载器创建并返回一个实例如下所示:

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

然后我调用一个方法(通过反射),并通过在自定义对象:

注意:TH IS是该行对引起

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

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

我很为难,什么可能会造成因为方法肯定是确实存在这需要指定自定义对象的异常的错误,我已经通过使用反射列出所有的方法证实了这一点。

+0

你尝试打印从这个类所有可用的方法,看看你的方法目前有?使用'getDeclaredMethods'。 –

+0

是的,如上所述,我已经成功地打印出所有方法。我想知道是否因为我使用了两个类加载器。 –

回答

2

你的自定义加载器的load()方法如何实例化它要返回的对象?也许NoSuchMethodException在尝试找到正确的构造函数时出现?

这个例子似乎摸出OK:

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()); 
    } 
} 
+0

最后一行应该是:m.invoke(obj,new CustomObject());我已更新我的问题以反映这一点。你的例子确实按预期工作,我怀疑它是因为你正在创建带有SAME ClassLoader的新对象,作为实例化ClassLoading类的对象。在我的例子中,我尝试传入由默认类加载器实例化的对象。 –

+0

此外,非常感谢您的详细解答。 –