2012-03-28 4 views
0

私は現在、リフレクションを使用してGUIクラスの宣言されたフィールドを取得しています。しかし、私は必要なオブジェクトにフィールドを型キャストする方法を見つけることができません。refectionフィールドを別のオブジェクトにタイプキャストすることはどのように可能ですか?

私が必要とするのは、Fieldの実際のオブジェクトを取得できることです。たとえば、返されるフィールドの型が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

+1

実際に何を達成しようとしていますか? (あなたのために行うために型キャストが必要ですか?) – ruakh

+0

UIオブジェクトを使用できるようにするために、他のUIコンポーネントにフィールドを型キャストできる必要があります。たとえば、フィールドをJLabelに変換します。 – ict1991

答えて

1

を?

(SomeSubClass)fieldType.newInstance(); 

私はさらにので、あなたが(おそらくClassCastException)例外を取得したい、fieldTypeSomeSubClassのスーパークラスであると仮定します。

例:

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

+0

@amit例外はスローされますか?少なくともOPは投げられなかったものを私たちに言った: 'no IllegalAccessExceptionがスローされた'): – Thomas

+0

* doh *。私は 'いいえ 'を逃した。 – amit

0

あなたは私にはあまり意味がありません求めています。そして、私はこれは、あなたが実際にオブジェクトが何であるかという明確な概念を持っていないためだと考えています。

Fieldオブジェクトは、クラスの特定のフィールドの記述子です。これは特定のインスタンスのフィールドを表すものではないので、フィールド内の値に「キャストする」ことは意味がありません。実際には、これは...

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 = ... 
関連する問題