我們正在研究動態類加載器項目,並嘗試通過URLClassLoader調用動態加載類中的方法。它在Eclipse中運行時運行得非常好,因此調用和動態加載的類被捆綁到兩個不同的jar中,然後部署到Server中,因爲它是要求分成兩個jar的一部分。無法通過java反射調用方法:NoSuchMethodException
NoSuchMethodException
使用反射API調用mapClass.getDeclaredMethod("run", oneParam)
時拋出異常。
我們已驗證Jar並確認正在調用的方法存在於類中。
下面是示例代碼..
import com.altova.io.Input;
import com.altova.io.FileInput;
Input sourceInput = new FileInput(inputFileFullPath);
Class oneParam[] = { Input.class };
Object mapObj = mapClass.newInstance();
Method method = mapClass.getDeclaredMethod(RUN, oneParam);
li = (List) method.invoke(mapObj, sourceInput);
例外是
java.lang.NoSuchMethodException:
com.sample.test.TrackingService.run(com.altova.io.Input)
唯一的區別我懷疑是輸入(在方法簽名)和的FileInput(在參數)。
它在Eclipse中運行良好,但不在服務器中運行。它與JDK 1.6 & 1.7測試,但服務器在JDK 1.7
第二個選項運行..試過,如下圖所示,但這次它拋出
java.lang.IllegalArgumentException異常:參數類型不匹配
代碼
for (Method method : mapClass.getDeclaredMethods()) {
method.setAccessible(true);
if (method.getName().equals("run")) {
Class<?>[] params = method.getParameterTypes();
if (params.length == 2) {
if (params[0].isInstance(sourceInput) && params[1].isInstance(outputStream)) {
li = (List<ByteArrayOutputStream>) method.invoke(mapObj, sourceInput, outputStream);
System.out.println(" Parsing is complete:");
}
}
}}
@Dirk Lachowski感謝您的編輯,使帖子清晰明瞭。 – Ramesh