2017-10-01 37 views
3

我試圖使用Reflection來聲明ArrayList。下面是我的代碼NoSuchMethodException java.lang.Integer的參數在構造函數中傳遞(Reflection)

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException { 
    String intClass="java.lang.Integer"; //This string will be replaced by a string taken from user which will be a class name. 
    Class classOf=Class.forName("java.util.ArrayList"); 
    Class[] parameterslist ={Class.forName(intClass)}; 
    Constructor constructorOfClass=classOf.getConstructor(parameterslist); 
} 

當我運行這段代碼,我得到

Exception in thread "main" java.lang.NoSuchMethodException: java.util.ArrayList.<init>(java.lang.Integer) 

當我修改parameterslist作爲

Class[] parameterslist={int.class} 

它的工作原理,但我必須考慮的參數類的名稱從用戶輸入,所以我不能直接寫int.class

我已經搜索了Class.forName()Classname.class之間的區別,但像this這樣的答案認爲它們是相同的。 我只想知道爲什麼我們不能使用Class.forName()對象作爲參數傳遞給ArrayList構造函數,當我編寫int.class時它是如何工作的?如果Class.forName()不是正確的方法,那麼我們如何才能將一個類名的對象作爲用戶的輸入?

+0

嗯,有一些原始類型。如果我是你,我會創建一個映射,並使用基本類型的名稱作爲鍵和相應的'Class'對象作爲值。 – Sweeper

+0

@Sweeper你是對的。這將解決問題,但仍然爲什麼我們不能爲此使用Class.forname? – Ahsan

+0

我不明白。您已將類名java.lang.Integer硬編碼到此代碼中。用戶輸入來自哪裏?或'Class.forName()'?這裏''Class.forName()'唯一的錯誤是你提供給它的參數。不清楚你在問什麼。 – EJP

回答

5

要使用ArrayList構造函數接受作爲參數原始int,而不是一個Integer類:

public ArrayList(int initialCapacity) 

您提供作爲參數Integer類:

String intClass="java.lang.Integer"; 
... 
Class[] parameterslist ={Class.forName(intClass)}; 

這些不兼容反射用法的類型。

如果Class.forname不是正確的方法,那麼我們怎樣才能將一個類名的對象 作爲用戶的輸入。

Class.forName()這裏不是問題。 如果您想通過將特定類的實例作爲構造函數的參數傳遞給對象來創建對象,則該類必須提供此類型的構造函數。
對於ArrayList,你只有兩個重載構造帶參數:

public ArrayList(Collection<? extends E> c) 

public ArrayList(int initialCapacity) 

所以,你可以通過反射與Collection型或int型檢索構造函數,這一切。

+0

OP希望得到一些用戶輸入並獲得與該輸入對應的'Class'對象。所以如果用戶輸入'int',他想要得到'int.class' – Sweeper

+0

@Sweeper也許。從他的實際問題或他發佈的代碼中看不出來。這是由他來澄清,而不是我們猜測。 – EJP

+0

@Sweeper如果是這樣,它真的不清楚。我最後回答到:「我只想知道爲什麼我們不能使用'Class.forName()'對象作爲參數傳遞給'ArrayList'構造函數,並且當我編寫'int.class'時它是如何工作的? 「 – davidxxx

相關問題