2012-03-28 99 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 = ... 
相关问题