0

我目前使用Reflection在類中執行一組方法,這些方法駐留在與我工作的不同的項目中。這些方法將依次調用此項目中的其他方法。雖然調用方法成功,但由NoSuchMethodError引起的InvocationTargetException正在拋出。我假設這是因爲我使用反射調用的方法調用其他方法。出於這個原因,我已經添加到類路徑另一個項目,但這不起作用。解決使用反射拋出的NoSuchMethodError異常

請注意,另一個項目是一個開源項目,我使用的是GitHub,我只是將它用於分析,因此我不想操縱它。

任何人都可以幫助我嗎?

編輯:

以下是我的反思當前的代碼:

public void runSelectedTests(MethodSignature test) throws Exception{ 
    //no paramater 
    Class<?> noparams[] = {}; 

    try{ 
     //load the test at runtime 
     //get the class 
     Class<?> cls = Class.forName(test.getClassName()); 
     Constructor<?>[] cons = cls.getDeclaredConstructors(); 
     //can use the first constructor if there are multiple 
     //if we instantiate with all constructors you end up calling the test methods depending on 
     //how many constructors you have 
     Constructor<?> cons1 = cons[0]; 
     Object params[] = null; 
     if(cons1.getParameterTypes().length > 0){ 
      params = new Object[cons1.getParameterTypes().length]; 
     } 
     for(int i = 0; i < cons1.getParameterTypes().length; i++){ 
      String type = cons1.getParameterTypes()[i].toString(); 
      if(type.equals("byte") || type.equals("short") || type.equals("int")){ 
       params[i] = 0; 
      }else if(type.equals("long")){ 
       params[i] = (long)0.0; 
      }else if(type.equals("float")){ 
       params[i] = (float)0.0; 
      }else if(type.equals("double")){ 
       params[i] = (double)0.0; 
      }else if(type.equals("char")){ 
       params[i] = (char)0; 
      }else if(type.equals("boolean")){ 
       params[i] = false; 
      }else{ 
       params[i] = null; 
      } 
     } 

     Object obj = cons1.newInstance(params); 
     //call the test method 
     Method method = cls.getDeclaredMethod(test.getName(), noparams); 
     method.invoke(obj, null); 
    }catch(Exception e){ 
     System.out.println("exception "+e.getMessage()); 
    } 
} 

對象MethodSignature存儲方法名和類的全名。

堆棧跟蹤:

Exception in thread "main" java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at com.Evaluation.TestRunner.runSelectedTests(TestRunner.java:72) 
    at com.Main.AnalyserFactory.main(AnalyserFactory.java:41) 
Caused by: java.lang.NoSuchMethodError: org.apache.commons.io.IOUtils.closeQuietly([Ljava/io/Closeable;)V 
    at org.apache.commons.io.IOUtilsTestCase.testCloseQuietly_AllCloseableIOException(IOUtilsTestCase.java:134) 
    ... 6 more 

編輯

這是我想調用的方法:

public void testCloseQuietly_AllCloseableIOException() { 
    final Closeable closeable = new Closeable() { 
     public void close() throws IOException { 
      throw new IOException(); 
     } 
    }; 
    IOUtils.closeQuietly(closeable, null, closeable); 
} 

的錯誤似乎就行了:

IOUtils.closeQuietly(closeable, null, closeable); 
+1

您可以使用實驗工作中的一些代碼修改您的問題嗎?這可以幫助我們提供一些答案。 – sakura

+0

只是提供了我的代碼來執行反射。 – gracey

+0

發佈整個堆棧跟蹤。哪一行引發異常? 'method.invoke(obj,null);'? – m0skit0

回答

3

類別org.apache.commons.io.IOUtils沒有任何方法closeQuietly需要java.io.Closeable作爲參數。它有以下幾種方法:

closeQuietly(InputStream input) 
    closeQuietly(OutputStream output) 
    closeQuietly(Reader reader) 
    closeQuietly(Writer writer) 

你應該相應地通過你的論點。希望這可以幫助。

+0

我有我從GitHub下載的源代碼。我很確定有一個close方法,用java.io.Closeable作爲參數。它在IOUtils.java類 – gracey

+0

比檢查您的代碼是否指向正確的源/罐 – Sanjeev

+0

我懷疑我沒有在類路徑中指定正確的文件夾。 – gracey

0

從1.5開始,所有方法反射方法都是參數值/類型的可變參數。

這看起來錯:

method.invoke(obj, null); 

如果沒有參數,因此稱之爲:

method.invoke(obj); 

僑胞,這樣的:

Method method = cls.getDeclaredMethod(test.getName(), noparams); 

可以/應該只是

Method method = cls.getDeclaredMethod(test.getName()); 
+0

沒有什麼區別 – gracey