Class.getConstructor和继承

时间:2014-07-14 12:35:56

标签: java

我想使用Class.getConstructor,因为在运行时我不知道我需要什么实例。

我有一个带有构造函数A(Type1)的A类。 Type2扩展了Type1。现在,当我调用A(Type2)时,编译器直觉我实际上正在调用构造函数A(Type1),因为A(Type2)不存在。但是,当我调用A.class.getConstructor(Type2.class)时,我得到一个运行时错误,说构造函数A(Type2)不存在。我可以理解为什么会发生这种情况,但是我仍然希望提供一个子类型的参数,并且为运行时提供所需的构造函数......

我真的不知道在运行时我需要什么类型的构造函数(上面对getConstructor的简化调用只是为了表明我的代码中发生了什么)而且我不知道,例如,我是否将实例化A的子类的对象,或使用Type1的子类的参数(例如,在示例中为Type2)。如何在运行时获得类似于编译时发生的事情?

感谢您的帮助,

欧文。

2 个答案:

答案 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
}

docs:getConstructorsisAssignableFrom