2017-09-24 111 views
0

我一直在閱讀一些地方,但我不能找到最好的解決方案,他們正在使用如何使用動態參數getConstructor在java中

Class tempClass = Class.forName(classname); 
Constructor constructor = tempClass.getDeclaredConstructor(String.class); 

他們明確自己的PARAMS類型,但如何如果tempClass是動態的,當然他們有不同的構造參數吧?

是否有解決此問題的任何解決方法?

+0

如果您不知道要查找的構造函數的參數,可以遍歷'tempClass.getDeclaredConstructors()'。 –

+0

你能舉一個例子說明你的意思是「tempClass是動態的」嗎? – EJK

回答

0

你需要用你期待的類型的參數重載你的構造函數。這被稱爲編譯時多態。例如,你想讓你的構造函數處理int float和char參數。您將需要用這些參數重載您的構造函數。這樣它就可以動態地處理不同的參數。

Example: 
    Constructor(int a, int b); 
    Constructor(char a, char b); 
    Constructor(float a, float b); 
1

getDeclaredConstructors()是如何定義的:

public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 

Class<?>...符號意味着該方法是variadic。它採用Class對象作爲參數列表,有兩種方式來提供名單:

  1. 可以列出的對象作爲單獨的參數:

    Constructor<?> ctor = getDeclaredConstructor(String.class, String.class, Integer.class, etc) 
    
  2. 您可以構建一個數組,該陣列通過作爲單個參數

    Class<?>[] classes = new Class<?>[3]; 
    classes[0] = String.class; 
    ... 
    Constructor<?> ctor = getDeclaredConstructor(classes); 
    

爲了找到一個構造不知道AHEA時間d有多少個參數或者它們的類型是多少,您可以使用第二種方法 - 構建一個描述您正在查找的參數列表的數組,然後以該數組作爲參數調用getDeclaredConstructor()。例如:

static <T> T construct(Class<T> aClass, Object...args) 
     throws NoSuchMethodException, SecurityException, 
     InstantiationException, IllegalAccessException, 
     IllegalArgumentException, InvocationTargetException { 
    Class<?>[] classes = new Class<?>[args.length]; 
    for (int ii = 0; ii < args.length; ++ii) { 
     classes[ii] = args[ii].getClass(); 
    } 

    Constructor<T> ctor = aClass.getDeclaredConstructor(classes); 
    return ctor.newInstance(args); 
} 
... 
String abc = construct(String.class, "abc"); 
URL google = construct(URL.class, "http", "google.com", "/"); 
相關問題