2011-07-24 34 views
3

在Java中,將在轉換中使用Class.forName結果將對象轉換爲類或轉換爲找到的轉換。作爲一個例子,如果你這樣做Class.forName轉換

Object a; 
String b = "testing"; 
a = (Class.forName("java.lang.Object")) b; 

會是一個類的實例或對象的實例嗎?

+4

我已經回答了你居然問這個問題,但我懷疑的是,你有一個潛在的,不同的問題;像這樣的問題通常是由某個人試圖解決的根本問題造成的,但是卻走上了錯誤的道路。我建議發佈一個(單獨的)問題,詢問潛在的問題,人們可能會告訴你如何到達那裏。 –

+1

無論如何:該代碼不能編譯,因此無法執行... – meriton

回答

9

Class.forName返回一個Class實例。我相當肯定你的代碼被引用不能編譯,你試圖使用一個函數調用作爲一個強制轉換。


更新:只是有一個想法:如果你問如何在投用動態加載的類,你基本不能。 Casting(主要)是編譯時的事情。讓動態加載的類實現一個可以編譯到代碼中的接口,然後轉換爲該接口,否則使用reflection訪問動態加載的類成員。

+0

謝謝。我只想知道它是否可以完成 –

0

Class.forName總是返回

9

您可以用類對象的.cast法鑄造:

Object a; 
String b = "testing"; 
a = Class.forName("java.lang.Object").cast(b); 

但你似乎有關於鑄造錯誤的想法 - 在Java中,鑄造不會改變任何對象,它只是告訴編譯器的對象是某種類型的,並且在運行時,VM將測試這是否真的如此(如果編譯器不能證明它的話)。如果你「受騙」,虛擬機將在這裏拋出ClassCastException(它不會轉換你的對象)。

(如果原始類型涉及它的工作原理略有不同。)

的類對象的方法cast是同樣的機制的一般變體。由於它具有返回類型T(來自Class<T>),因此這允許通用代碼將未知對象轉換爲某種類類型,其中此類對象對應於類型變量。 這不會對你有幫助 - Class.forName的返回類型是Class<?>,這意味着它的投射方法只能返回Object

無論如何,鑄造到java.lang.Object沒有任何效果(它總是會成功),除了隱藏到編譯器的值有一些專門的類型。 (如果你有重載方法,這可能無所謂。)

簡單地寫

Object a; 
String b = "testing"; 
a = b; 

在這裏有同樣的效果。

+0

感謝您的回答。 –

1

如果需要投一個實例,這是一個辦法做到這一點

String className   = "YourClass"; 
Class someClass   = Class.forName(className); 
Constructor constructor = (Constructor) someClass.getConstructor(); 
Object someInstance  = constructor.newInstance(); 

// now you can cast as allways. 
(YourClass) (someInstance)