2012-11-08 34 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

此外,非常感謝您的詳細解答。 –