Как определить, в каком классе объявлено поле - PullRequest
0 голосов
/ 05 ноября 2011

Есть ли способ определить, в каком классе объявлено поле из такого кода:

Class myObjClass = myObj.myField.getWhereDeclaredClass ();

Редактировать: Возможно, я не выразил свойЯ правильно.Рассмотрим класс myObj следующим образом:

class MyObj {
  MySecondObj myField = new MySecondObj ();
}

myField НЕ относится к типу java.lang.reflect.Field, и я не хочу использовать жестко закодированные строки строк с getField (String).Синтаксис должен быть:

myObj.myField.getWhereDeclaredClass ()

Есть ли способ сделать это?

1 Ответ

4 голосов
/ 05 ноября 2011

Field.getDeclaringClass() может работать.

Пример:

class A{
    public int f;
}
class B extends A{
    public int g;
}
class C extends B{
    public int h;
}

class Test{

    public static void main(String[]args) throws Exception{

        Class<C> c = C.class;
        System.out.println(c.getField("f").getDeclaringClass());
        System.out.println(c.getField("g").getDeclaringClass());
        System.out.println(c.getField("h").getDeclaringClass());

    }

}

Печать:

class A
class B
class C

Изменить:

Лично я не знаю, как сделать это без размышлений. С другой стороны, написание «.myField» подразумевает, что вы знаете, что объект имеет это поле, так что в некотором смысле оно все еще жестко закодировано, и это также подразумевает, что у вашего отражательного кода, по сути, нет никаких шансов фактически вызвать исключение.

Есть ли какая-то особая причина не использовать отражение? Если это производительность, вы можете сделать это один раз с отражением, а затем жестко закодировать полученное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...