簡體   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