2010-03-17 75 views
2
Class.forName(boolean.class.getName()); 

這在Java中不起作用 - 虛擬機使用ClassNotFoundException強加於您。我需要類似的東西,因爲我想基於字符串包含的方法簽名,以反映方法,如根據類型簽名創建類對象

public void doSomething(boolean yesWeCan, java.lang.String[] presidents); 

最後我想出了一個自定義「的ClassFactory」它轉換類型的字符串類對象。這個工廠包含很多用於原始類型和數組類型值的處理程序。

數組類型對象的處理程序是這樣的:

if (isArrayOfObjects) { 
    return Class.forName("L["+typeName.replace("[]", "")+";"); 
} 

我的問題是 - 我已經錯過了一些在Java API 1.5+可能做的伎倆嗎?

編輯

謝謝您的回答,這不是一個驚喜,Class.forName作品非常好與包裝類。但是我正在尋找所有java類型的解決方案,包括數組和基元。因此我的第一行不是拼寫錯誤。有些方法簽名確實具有java基元作爲參數,我不能僅僅使用包裝類來反映庫中的方法,我真的需要該類型的類對象(如布爾值)。

Class<boolean> booleanClassObject = boolean.class; 

做工精細,以及

String name = boolean.class.getName(); 
+0

'boolean'是一種原始數據類型,'Boolean'(注意是大寫B)是類。你必須使用這個類。 –

+0

他試圖使用Boolean.TYPE。 – bmargulies

回答

1

也許你有一些if S:

if (type.equals("boolean")) { 
    return boolean.class; 
} else if (type.equals("int")) { 
    return int.class; 
} .. etc 
+0

這就像在我的實際ClassFactory。如果我沒有錯過Java API中顯而易見的東西,那麼我堅持下去。 –

1

下面的工作:

Class.forName(Boolean.class.getName()); 

自動(UN)拳擊應該處理轉換到實際的基本類型。雖然沒有看到更多的代碼,我不能確定這是否能解決您的問題。

+0

好主意 - 但是我得到一個'Class '對象,但是我需要一個'Class '(因爲這個例子)。 –

+0

@Andreas:布爾(帶有一個小b)不是一個類,永遠不能以這種方式實例化。這是(部分)布爾類(和其他類似的基元類)的原因。如果您提供了更完整的代碼示例,這將會很有幫助。這可能會讓用戶建議一種替代方法。 – Kris

+0

請仔細閱讀我的問題。我不想實例化任何原始的Java類型。我需要調用方法(或者,更準確地說,只是檢查聲明的方法是否存在於庫中),因此我需要將方法參數類型作爲'Class []'傳遞。所以如果一個方法有一個'boolean'參數(''boolean''應該是我的輸入值),我需要'boolean.class'對象。 –

0

你可以嘗試使用布爾包裝類而不是原始布爾值嗎?

+0

他想要Boolean.TYPE,而不是Boolean.class。 – bmargulies

+0

我需要'boolean.class'作爲輸入''boolean「'的結果(對於所有的java類型都是一樣的,比如''String [] .''''String] []」') –

0

您正在使用布爾,它是java中的一個基元。您必須在java中使用布爾值wrappaer類。

+0

我不能在這種情況下使用布爾值,因爲我需要'boolean.class',而不是'java.lang.Boolean.class' –

1

實際創建一個數組可能更容易,然後詢問它的.class。這就是我過去所做的。

+0

...所以堅持'工廠'的解決方案,支持基元查找表(我的一打if語句) –

0
primitive type is a object and not a class. it can't getClassLoader and getClassName. 
the below expression will be wrong. 
boolean a = new boolean(); 
+0

'boolean.class'是有效的並且是一個Class對象。 –