我有一个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)
我调试了代码,类信息有关于定义的构造函数的正确细节;但是,例外就在这里。
有人知道错过了什么吗?谢谢!
答案 0 :(得分: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);
}
}
<强> 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编译。