我目前使用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);
您可以使用實驗工作中的一些代碼修改您的問題嗎?這可以幫助我們提供一些答案。 – sakura
只是提供了我的代碼來執行反射。 – gracey
發佈整個堆棧跟蹤。哪一行引發異常? 'method.invoke(obj,null);'? – m0skit0