繁体   English   中英

使用反射时 NoSuchMethodException

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM