2016-08-16 128 views
1

我們正在研究動態類加載器項目,並嘗試通過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:"); 
     } 
    } 
}} 
+0

@Dirk Lachowski感謝您的編輯,使帖子清晰明瞭。 – Ramesh

回答

0

它在類加載器如下所示改變時工作,如下所示。

URLClassLoader loader = new URLClassLoader(new URL[] { new URL("file:/opt/jars/Tracking.jar") }, this.getClass().getClassLoader());

其餘的一切一樣...我說,出將當前類裝載器也是在Eclipse中運行時的工作。

1

看來你試圖調用非公共方法。所有你需要的就是製作它accessible

Method method = mapClass.getDeclaredMethod(RUN, oneParam); 
method.setAccessible(true); 
+0

感謝vsminkov您的評論。編輯後,錯誤是在調用getDeclaredMethod()時。 – Ramesh

+0

按照你的建議嘗試..但這次它拋出java.lang.IllegalArgumentException:參數類型不匹配,任何建議? – Ramesh

+0

@Ramesh可能在'mapClass'中有多個'run'方法?在你的編輯中,當你演示只有一個參數運行時(com.altova.io.Input),你試圖調用'run'運行'' – vsminkov