我想使用Class.getConstructor,因为在运行时我不知道我需要什么实例。
我有一个带有构造函数A(Type1)的A类。 Type2扩展了Type1。现在,当我调用A(Type2)时,编译器直觉我实际上正在调用构造函数A(Type1),因为A(Type2)不存在。但是,当我调用A.class.getConstructor(Type2.class)时,我得到一个运行时错误,说构造函数A(Type2)不存在。我可以理解为什么会发生这种情况,但是我仍然希望提供一个子类型的参数,并且为运行时提供所需的构造函数......
我真的不知道在运行时我需要什么类型的构造函数(上面对getConstructor的简化调用只是为了表明我的代码中发生了什么)而且我不知道,例如,我是否将实例化A的子类的对象,或使用Type1的子类的参数(例如,在示例中为Type2)。如何在运行时获得类似于编译时发生的事情?
感谢您的帮助,
欧文。
答案 0 :(得分:1)
执行此操作并让Java在运行时执行编译器在编译时执行的操作的简单方法是使用java.beans.Expression
:
Type2 ctorArg = ...;
Expression expr = new Expression(A.class, "new", new Object[]{ctorArg});
A a = (A)expr.evaluate();
E&安培; OE
答案 1 :(得分:0)
您可以获取所有构造函数并过滤它们以获得所需(它不关心varargs,但我认为,您可以通过这种方式扩展它):
Class<?> myClass = ...
Class<?>[] passedParams = ...
Constructor<?>[] constructors = myClass.getConstructors();
for (Constructor <?> constructor : constructors) {
Class<?> receivedParams = constructor.getParameterTypes();
if (passedParams.length != receivedParams.length) {
continue;
}
for (int i = 0; i < passedParams.length; ++i) {
if (!passedParams[i].isAssignableFrom(receivedParams[i])) {
continue;
}
}
// Yep, here we got correct constructor!
correctConstructors.add(constructor); // or whatever you like to do with it
}