2014-06-30 98 views
0

我正在使用反射將ResultSet映射到bean中的FieldJava反射:在不知道類型的情況下將對象投射到另一個對象

field = clazz.getDeclaredField(str); 
field.setAccessible(true); 
Object resultSetObject = rs.getObject(str); 
Class fieldType = field.getType(); 
field.set(clazzInst, fieldType.cast(resultSetObject)); 

問題是resultSetObjectInteger型和fieldType是長期的,我不能投Intger龍和獲取ClassCastException

+0

這個問題可能會幫助你http://stackoverflow.com/questions/6690745/converting-integer-to-long – Gallo2fire

+0

在這個問題中,你明確知道你必須將Integer轉換爲Long,但是在這裏我不知道關於它們的類型 – Dheerendra

+0

鑄造不會對對象的類型做任何事情。 –

回答

0

您實質上是要求複製編譯時可用的類型知識,並使編譯器生成正確的轉換。運行時沒有這方面的知識,因此您必須通過構建一個類型矩陣並明確地編碼所需的所有轉換來提供它。

可以將此定義爲通過類型沿着兩個軸索引(從型和型)的矩陣或更可能作爲一個地圖,其關鍵是ConversionType對象中的每個實例定義fromTypetoType其中和convert()方法。

0

無論你是否有

Object ref = new String("object of type string"); 

String ref = new String("still object of type string"); 

引用將String類型的對象。做

Object obj = (Object) new String("still a string"); 

不會改變引用的對象是String。在你的情況下,你可能需要一種轉換策略來在類型之間進行轉換。

+0

這很有趣,但請你分享一下你的資料,以便我可以瞭解更多信息嗎?謝謝 –

+1

@ kick我現在沒有任何權利。你必須區分實例,引用和變量。 –

0

您還有另一個選項,將long轉換爲字符串,然後轉換爲整數。

+0

但是因爲我不明白它們的類型,所以我必須爲fieldType和resultSetObject可以是不同類型(如Date,int,Double Boolean或任何其他類型)的情況做好準備 – Dheerendra

+0

您不知道確切的數據類型你的數據庫?您可以從數據庫元數據中讀取它。 –

+0

我可以做到這一點,但我必須定義從每種可能類型到其他類型的轉換策略 – Dheerendra