我想使用Class.getConstructor,因为在运行时之前我不知道需要哪些实例。
我有一个带有构造函数A(Type1)的A类。Type2扩展了Type1。现在,当我调用A(Type2)时,编译器直觉地说我实际上是在调用构造函数A(Type1),因为A(Type2)并不存在。但是,当我调用A.class.getConstructor(Type2.class)时,会收到一个运行时错误,说明构造函数A(Type2)不存在。我可以理解为什么会发生这种情况,但我仍然希望提供一个子类型的参数,并为运行时提供所需的构造函数.
我真的不知道在运行时我需要什么样的构造函数(上面对getConstructor的简化调用只是为了指示我的代码中发生了什么),我也不知道,例如,我将实例化A子类的一个对象,还是使用Type1子类的一个参数(例如,在示例中)。如何使在运行时发生的类似事情发生在编译时?
谢谢你的帮助,
欧文。
发布于 2014-07-16 04:14:46
要做到这一点,并让Java在运行时执行编译器在编译时所做的操作,最简单的方法是使用java.beans.Expression。
Type2 ctorArg = ...;
Expression expr = new Expression(A.class, "new", new Object[]{ctorArg});
A a = (A)expr.evaluate();E&OE
发布于 2014-07-14 12:50:12
您可以获得所有构造函数并对它们进行筛选以获得所需的(它不关心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
}博士:getConstructors,isAssignableFrom
https://stackoverflow.com/questions/24736678
复制相似问题