java.lang.NoSuchMethodException和参数化构造函数

时间:2013-04-25 08:34:49

标签: java

我有一个Foo类如下:

public class Foo extends Bar
{
    public Foo(com.example.X displayState, com.example.Y parent)
    {
        super(displayState, parent);
    }
}

Bar类如下所示:

public abstract class Bar {

    public Bar(com.example.X displayState, com.example.Y parent)
    {
        // do something with received params
    }
}

此外,还有一个工厂类,其中包含以下方法:

 public static Object getInstance(Class theSourceClass, Class theTargetClass, Class[] parameterClasses, Object[] parameterValues)
 {
     Class theClass = (theTargetClass == null) ? theSourceClass : theTargetClass;

     try
     {
         Constructor classConstructor = theClass.getConstructor(parameterClasses);
         return classConstructor.newInstance(parameterValues);
     }
     catch (NoSuchMethodException exp)
     {
         // log
     }

问题是始终出现NoSuchMethodException例外:

java.lang.NoSuchMethodException: com.example.Foo.<init>(com.example.X, com.example.Y)
at java.lang.Class.getConstructor0(Class.java:2715) 
at java.lang.Class.getConstructor(Class.java:1659)
at com.example.MyFactory.getInstance(MyFactory.java:30)

我调试了代码,类信息有关于定义的构造函数的正确细节;但是,例外就在这里。

有人知道错过了什么吗?谢谢!

2 个答案:

答案 0 :(得分:2)

以下示例将生成Foo的实例。该示例确保Bar中存在接受XY的构造函数。

<强> Foo.java

public class Foo extends Bar {
    public Foo(com.example.X displayState, com.example.Y parent) {
        super(displayState, parent);
    }
}

<强> Bar.java

import com.example.X;
import com.example.Y;


public class Bar {

    public Bar(X displayState, Y parent) {
        // TODO Auto-generated constructor stub
    }

}

<强> X.java

package com.example;

public class X {

}

<强> Y.java

 package com.example;

public class Y {

}

<强> Test.java

import java.lang.reflect.Constructor;

import com.example.X;
import com.example.Y;

public class Test {
    public static void main(String[] args) {
        Class[] classes = {X.class, Y.class};
        Object[] values = {new X(), new Y()};

        Object obj = getInstance(Foo.class, null, classes, values);

        System.out.println(obj);
    }

    public static Object getInstance(Class theSourceClass,
            Class theTargetClass, Class[] parameterClasses,
            Object[] parameterValues) {
        Class theClass = (theTargetClass == null) ? theSourceClass
                : theTargetClass;

        try {
            Constructor classConstructor = theClass
                    .getConstructor(parameterClasses);
            return classConstructor.newInstance(parameterValues);
        } catch (Exception e) {

        }
        return null;
    }
}

答案 1 :(得分:0)

问题的根源是编译的Bar,X,Y和工厂类的不同版本,它们用于编译和运行时。让我解释一下。

所有4个人(Bar,X,Y和工厂类)都被编译并来自库文件以进行Foo类编译。但是,生产系统总是重新编译这些类。

我创建了库,将它连接到构建路径,并忘了它。从技术上讲,项目在编译过程中没有错误,但反射失败了。

解决方案很简单 - 删除库并使用重新生成的Bar,X,Y和工厂类进行Foo编译。