Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用反射时出现NoSuchMethodException_Java_Class_Unit Testing_Methods - Fatal编程技术网

Java 使用反射时出现NoSuchMethodException

Java 使用反射时出现NoSuchMethodException,java,class,unit-testing,methods,Java,Class,Unit Testing,Methods,接口 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 lo

接口

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();
    }
}
package com.jtest.tool;
导入com.filter.tool
公共类工具测试{
@试验
公开无效测试(){
int[]大小={1,2};
整数计数=1;
试试{
类别cls=工具类别;
构造函数=cls.getDeclaredConstructor();
constructor.setAccessible(true);
工具工具=(工具)构造函数.newInstance();
List pref=工具。findTools(大小、计数);
系统输出打印项次(pref);
}捕获(例外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)
java.lang.NoSuchMethodException:com.filter.tool.()
位于java.lang.Class.getConstructor0(Class.java:2715)
位于java.lang.Class.getDeclaredConstructor(Class.java:1987)
位于com.att.lpp.prov.jtest.resman.impl.PoolTest.test(PoolTest.java:24)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于org.junit.runners.model.FrameworkMethod$1.runReflectVeCall(FrameworkMethod.java:47)
位于org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
位于org.junit.runners.model.FrameworkMethod.invokeeexplosive(FrameworkMethod.java:44)
位于org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
位于org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
位于org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
位于org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
位于org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
访问org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
位于org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
位于org.junit.runners.ParentRunner.run(ParentRunner.java:309)
位于org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
位于org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

但是,如果我从toolTest中更改包名,它会警告我并试图让我更改代码的可见性。我不想更改代码。我是否遗漏了什么?

首先:由于在测试类中导入,它似乎会尝试查找接口实例的构造函数,因为com.filter.tool.tool是工具interface,不是一个类。你必须重命名你的类或接口,使其更清晰,或者对包做些什么

第二:你的工具类中有一个带参数的构造函数,这意味着你还没有一个默认的构造函数。但是你的测试使用反射来获得一个没有参数的默认构造函数。你必须修改你的测试方法逻辑,让它寻找带参数的构造函数,为此你必须调用getDeclaredConstruct或使用参数类数组,如:

Class[] cArg = new Class[5];
cArg[0] = Log.class;
cArg[1] = Key.class;
...
Constructor<?> constructor = cls.getDeclaredConstructor(cArg);
Class[]cArg=新类[5];
cArg[0]=Log.class;
cArg[1]=Key.class;
...
构造函数=cls.getDeclaredConstructor(cArg);

在您的测试中,它不应该是
导入com.filter.tool.impl.tool吗?不可见,如果我手动导入,我会收到一个错误,说“将工具更改为公共”如何实现一个包?
类工具扩展资源实现com.filter.Tool
。这是无效的代码。有太多不可编译的代码,任何人都无法给你一个正确的答案。因为接口名和类名是相同的,所以代码是可编译的,并且运行良好。仅仅为此编写测试就让我受挫