1

我有一个类 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)

我已经调试了代码,并且类信息具有有关已定义构造函数的正确详细信息;但是,这里是例外。

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

4

2 回答 2

2

以下示例将生成Foo. 该示例确保Bar存在一个接受X和的构造函数Y

Foo.java

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

酒吧.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 {

}

测试.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;
    }
}
于 2013-04-25T08:45:41.710 回答
0

问题的根源在于用于编译和运行时的已编译 Bar、X、Y 和工厂类的不同版本。让我解释。

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

我创建了库,将其连接到构建路径,然后忘记了它。从技术上讲,该项目在编译期间没有错误,但反射失败。

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

于 2013-04-25T13:56:50.947 回答