Как можно типизировать поле рефекции в другой объект? - PullRequest
0 голосов
/ 28 марта 2012

В настоящее время я использую отражение, чтобы получить объявленные поля класса 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);
                }

        }

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Полагаю, вы хотите сделать что-то подобное, не так ли?

(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 голосов
/ 28 марта 2012

То, что вы спрашиваете, не имеет большого смысла для меня. И я подозреваю, что это потому, что у вас нет четкого представления о том, чем на самом деле является Field объект.

A Field объект - дескриптор для определенного поля класса. Он не представляет поле конкретного экземпляра, поэтому «приведение его» к значению в поле не имеет большого смысла. На самом деле это ...

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

... is на самом деле создает новый экземпляр типа поля 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 = ...
...