首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Class.getConstructor与继承

Class.getConstructor与继承
EN

Stack Overflow用户
提问于 2014-07-14 12:35:55
回答 2查看 175关注 0票数 0

我想使用Class.getConstructor,因为在运行时之前我不知道需要哪些实例。

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

我真的不知道在运行时我需要什么样的构造函数(上面对getConstructor的简化调用只是为了指示我的代码中发生了什么),我也不知道,例如,我将实例化A子类的一个对象,还是使用Type1子类的一个参数(例如,在示例中)。如何使在运行时发生的类似事情发生在编译时?

谢谢你的帮助,

欧文。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-16 04:14:46

要做到这一点,并让Java在运行时执行编译器在编译时所做的操作,最简单的方法是使用java.beans.Expression

代码语言:javascript
复制
Type2 ctorArg = ...;
Expression expr = new Expression(A.class, "new", new Object[]{ctorArg});
A a = (A)expr.evaluate();

E&OE

票数 1
EN

Stack Overflow用户

发布于 2014-07-14 12:50:12

您可以获得所有构造函数并对它们进行筛选以获得所需的(它不关心varargs,但我认为,您可以这样扩展它):

代码语言:javascript
复制
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
}

博士:getConstructorsisAssignableFrom

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24736678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档