2012-03-28 93 views
0

我目前使用反射來獲取GUI類的聲明字段。但是我找不到一種方法能夠將字段轉換爲我需要的對象。如何將一個反射字段轉換爲另一個對象?

我需要的是能夠獲得字段的實際對象,所以如果例如返回的字段是JLabel類型,我需要能夠在JLabel中對字段進行類型轉換以便訪問對象

以下是我使用的代碼,但是實際的對象組件沒有被檢索:

for (int i = 0; i< fields.length; i++) { 
       this.fields.add(fields[i]); 
       Class<?> fieldType = fields[i].getType(); 
       try { 
        Component c = (Component) fieldType.newInstance(); 
        System.out.println(c.getX + " " + c.getY()); 

       } catch (InstantiationException ex) { 
        Logger.getLogger(HeatMap.class.getName()).log(Level.SEVERE, null, ex); 
       } catch (IllegalAccessException ex) { 
        Logger.getLogger(HeatMap.class.getName()).log(Level.SEVERE, null, ex); 
       } 

     } 
+3

什麼異常?請顯示堆棧跟蹤 – amit 2012-03-28 11:38:52

+1

你究竟在做什麼? (你期望類型轉換爲你做什麼?) – ruakh 2012-03-28 11:40:41

+0

我需要能夠將字段轉換爲其他UI組件,因爲我需要能夠使用UI對象...例如將字段轉換爲JLabel – ict1991 2012-03-28 11:46:06

回答

1

我假設你想要做這樣的事情,不是嗎?

(SomeSubClass)fieldType.newInstance(); 

我進一步假定fieldType是一個超類的SomeSubClass,這樣你會得到一個異常(最可能是ClassCastException)。

例子:

class A {} 
class B extends A{} 

fieldType = A.class; 

//this would throw an exception since A it NOT a B! 
(B)fieldType.newInstance(); 

編輯

鑄就對象,你需要使用instanceof關鍵字的東西。

例子:

Object value = field.get(objectTheFieldBelongsTo); 

if(value instanceof JLabel) { 
    JLabel labelValue = (JLabel)value; 
    //whatever you want 
} 
+0

錯誤引發異常:\ – amit 2012-03-28 11:48:37

+0

@amit會拋出什麼異常?至少OP告訴我們什麼是_not_拋出:'拋出IllegalAccessException異常:) :) – Thomas 2012-03-28 11:54:21

+0

* doh *。我錯過了「不」。 – amit 2012-03-28 11:57:39

0

你所要求沒有多大意義的我。我懷疑這是因爲你不清楚什麼是對象。

A Field object是一個類的特定字段的描述符。它不代表特定實例的字段,因此將其「轉換爲」字段中的值並沒有多大意義。事實上,這...

Class<?> fieldType = f.getType(); 
    fieldType.newInstance(); 

...是實際上創建領域f類型的新實例。這與任何現有對象中的f字段的值無關。

可以得到一個字段的一些對象的值,但要做到這一點,你需要說你想要的類型的特定對象:

// Assume Foo has a field bar of type Bar 

Foo foo = ... 
Field<?> f = Foo.class.getDeclaredField("bar"); 
Bar foobar = (Bar) f.getObject(foo); 

Field f = ... 
相關問題