[英]NoSuchMethodException when using reflection
界面...
package com.filter.tool
public interface Tool extends Resource {
...
List findTools(int[] sizes, int counts);
}
代碼...
package com.filter.tool.impl;
class Tool extends Resource implements com.filter.tool{ //default class (not visible)
Tool(Log log, Key key, Def def, Init init, Collection items) {
super(log, key, def, init, null, null, 0, 0, 0, 0, 0, null, null, 0, false, items);
}
...
public List findTools(int[] sizes, int counts) {
....
}
...
}
在工具測試中
package com.jtest.tool;
import com.filter.tool
public class ToolTest {
@Test
public void test(){
int[] sizes = {1,2};
int counts = 1;
try {
Class<?> cls = Tool.class;
Constructor<?> constructor = cls.getDeclaredConstructor();
constructor.setAccessible(true);
Tool tool = (Tool) constructor.newInstance();
List pref = tool.findTools(sizes, counts);
System.out.println(pref);
} catch (Exception e) {
e.printStackTrace();
}
}
當我運行測試時,我得到了..
java.lang.NoSuchMethodException: com.filter.tool.<init>()
at java.lang.Class.getConstructor0(Class.java:2715)
at java.lang.Class.getDeclaredConstructor(Class.java:1987)
at com.att.lpp.prov.jtest.resman.impl.PoolTest.test(PoolTest.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
但是如果我從 toolTest 更改包名稱,它會警告我並試圖讓我更改代碼的可見性。 我不想更改代碼。 我錯過了什么嗎?
第一:看起來,由於在您的測試類中導入,它試圖尋找接口實例的構造函數,因為 com.filter.tool.Tool 是 Tool 接口,而不是類。 你必須重命名你的類或接口,使其更清晰或對包做一些事情......
第二個:你的 Tool 類中有一個帶參數的構造函數,這意味着你還沒有默認的構造函數。 但是您的測試使用反射來獲取沒有參數的默認構造函數。 您必須修改您的測試方法邏輯,使其尋找帶參數的構造函數,為此您必須使用參數類數組調用 getDeclaredConstructor,例如:
Class[] cArg = new Class[5];
cArg[0] = Log.class;
cArg[1] = Key.class;
...
Constructor<?> constructor = cls.getDeclaredConstructor(cArg);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.