2012-11-13 59 views
5

我在使用java中的invoke方法時遇到問題。具有參數的私有靜態方法的Java反射

我有一個方法用來提供我Method對象,它看起來像:

public static Method provideMethod(String methodName, Class targetClass) throws NoSuchMethodException { 
    Method method = targetClass.getDeclaredMethod(methodName,null); 

    //Set accessible provide a way to access private methods too 
    method.setAccessible(true); 

    return method; 
} 

好這個方法完美的作品,當我試圖訪問方法,從任何方面(靜態或非靜態),沒有參數。

現在的問題是,我不能叫調用和參數傳遞給有參數的方法,例如:

我有以下方法:

private static boolean createDirectory(String path, String fileName) { 
    ... 
} 

而且我想要調用它是這樣的:

Boolean created = (Boolean) DataUtils.provideMethod("createDirectory", FileUtils.class). 
      invoke(null, String.class, String.class); 

但我得到java.lang.NoSuchMethodException: createDirectory []

有人知道如何調用一個具有參數的私有靜態方法嗎?

而且,如何將值傳遞給方法參數?

感謝, Arkde

回答

6

你顯式調用看起來與給定參數類型定義的方法反射法 - 但你沒有提供任何參數類型。

如果你想找到任何方法用給定的名稱,使用getDeclaredMethods(),只是按名稱過濾...但是當你打電話invoke,您需要提供該字符串值,沒有參數類型。

或者,改變你的provideMethod呼叫接受的參數類型,所以你可以使用:

DataUtils.provideMethod("createDirectory", FileUtils.class, 
         String.class, String.class) 
     .invoke(null, "foo", "bar") 
+0

感謝它的工作:) – Arkde

2

你只專門查找方法與當你調用無參數

Method method = targetClass.getDeclaredMethod(methodName,null) 

爲了找到createDirectory方法,您需要致電

targetClass.getDeclaredMethod("createDirectory", String.class, String.class) 

但目前您的provideMethod方法沒有辦法做到這一點。

我建議你改變provideMethod所以它的簽名,它允許調用者中,他們正在尋找的參數類傳遞,就像這樣:

public static Method provideMethod(String methodName, Class targetClass, Class... parameterTypes) throws NoSuchMethodException { 
    Method method = targetClass.getDeclaredMethod(methodName, parameterTypes); 

    //Set accessible provide a way to access private methods too 
    method.setAccessible(true); 

    return method; 
} 
+0

謝謝! :)我感謝你的回答,它幫助我:) – Arkde

2

更改此

Method method = targetClass.getDeclaredMethod(methodName, null); 

到類似的東西

Method method = targetClass.getDeclaredMethod(methodName, Class<?>... parameterTypes); 

和你provideMethod

+0

謝謝! :)我感謝你的回答,它幫助了我:) – Arkde

相關問題