我目前正在使用反射来获取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);
}
}
答案 0 :(得分: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
}
答案 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 = ...