2015-04-16 57 views
0

我一直在試圖開發一個應用程序。一個bean腳本將按照需求編寫,然後按照需求以不同的順序調用方法(在應用程序中定義)。應用程序代碼(除了bean腳本)不會被更改。使用java反射api調用通用方法

此外,應用程序使用外部罐子提供大量的方法 - 其中一些在應用程序中實現。但是,如果需求出現,我希望有可能使用其他方法(尚未實現的方法)而不更改應用程序。爲此,我想使用Java反射API。用戶應該能夠通過傳遞方法名稱和相應的參數(使用外部jar文檔)來調用外部容器中的任何方法。

我是一個Java新手,所以我有試圖實現它的一些代碼(可能不是語法正確):

public void callExternalJarMethod(String methodName, Class[] methodParameterTypes, Object[] methodParameters) 
throws NoSuchMethodException { 

String className = "SampleClassName"; 
Class classObject = Class.forName(className); 
Method methodObject; 

    if (methodParameterTypes.length == 0) { 
     methodObject = classObject.getMethod(methodName, null); 
    } else {   
     methodObject = classObject.getMethod(methodName, methodParameterTypes);   
    } 

    // Not handling calling of static methods in which case "null" would be passed instead of methodObject to the invoke method 
    Object returnValue = methodObject.invoke(methodObject, methodParameters); 
} 

我試圖找到一種方法,我可以得到的Class [] methodParameterTypes和Object [] methodParameters填充相關的值。我將參數類型和參數值作爲字符串。此外,任何指向有用的應用程序的指針將不勝感激。

在此先感謝。

+0

那麼,什麼是參數類型和值? – immibis

+0

由於它是一般用法,因此參數類型可以是Integer,String和其他可能的(類型)參數。參數值將是從String(輸入)到相應參數類型的類型的實際值。 – user34140

+0

你不能簡單** ** ** String到任意類。 – fabian

回答

0

你是不是傳遞一個實例的SampleClassNameMethod.invoke()調用這裏...

Object returnValue = methodObject.invoke(methodObject, methodParameters); 

如果你要調用的方法是靜態,你可以做到這一點...

Object returnValue = methodObject.invoke(null, methodParameters); 

否則(非靜態),你需要創建的實例SampleClassName來執行該方法。

如果類不需要任何構造函數的參數,你可以使用...

Object returnValue = methodObject.invoke(classObject.newInstance(), methodParameters); 

(顯然會有你需要做「的newInstance」和處理「援引」例外的負載...)

+0

不太確定,如果這真的是一個關於泛型的問題,它更多的是反射API之一... – BretC

+0

感謝佈雷特。對於混淆抱歉 - 問題不在於泛型。我的意思是泛型,試圖傳達我可能需要調用的方法可能會有所不同,並且可能需要各種參數,如String,Int等。 – user34140