如何将反射场强制转换为另一个对象?

时间:2012-03-28 11:37:00

标签: java reflection casting field

我目前正在使用反射来获取GUI类的声明字段。但是我找不到能够将字段强制转换为我需要的对象的方法。

我需要的是能够获取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);
                }

        }

2 个答案:

答案 0 :(得分:1)

我认为你想做这样的事,不是吗?

(SomeSubClass)fieldType.newInstance();

我进一步假设fieldTypeSomeSubClass的超类,因此你会得到一个例外(很可能是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
}

答案 1 :(得分:0)

你所问的对我来说没什么意义。我怀疑这是因为你对Field对象的真实含义没有明确的概念。

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 = ...