[英]Class.getConstructor and inheritence
我想使用Class.getConstructor,因為直到運行時我才知道需要什么實例。
我有一個帶有構造函數A(Type1)的類A。 Type2擴展了Type1。 現在,當我調用A(Type2)時,編譯器會認為我實際上是在調用構造函數A(Type1),因為A(Type2)不存在。 但是,當我調用A.class.getConstructor(Type2.class)時,出現運行時錯誤,指出構造函數A(Type2)不存在。 我可以理解為什么會這樣,但是我仍然想提供一個子類型的參數,並為運行時提供所需的構造函數...
我真的不知道我在運行時需要哪種類型的構造函數(上面對getConstructor的簡化調用只是為了指示代碼中正在發生的事情),而且我不知道例如是否要實例化A子類的對象,或使用Type1子類的參數(在示例中為Type2)。 我如何在運行時獲得與編譯時相似的事情?
謝謝您的幫助,
歐文。
做到這一點並使Java在運行時完成的最簡單方法是使用編譯器在編譯時執行的操作: java.beans.Expression
:
Type2 ctorArg = ...;
Expression expr = new Expression(A.class, "new", new Object[]{ctorArg});
A a = (A)expr.evaluate();
E&OE
您可能會獲得所有構造函數並對其進行過濾以獲取所需的構造函數(它並不關心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: getConstructors
, isAssignableFrom
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.