簡體   English   中英

Class.getConstructor和繼承

[英]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: getConstructorsisAssignableFrom

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM