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

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

Другими словами:

 public class MuchoStatic {

    private static staticMember;

    getStaticMember(){

    return this.staticMember;

    }
    } //end class

то есть еще код:

Method m = null;

try{

  m = MuchoStatic.class.getMethod("getStaticMember",null);

} catch (Exception e) {

}

Object o = null;
try{

 o = m.invoke(MuchoStatic.class,null);

} catch (Exception e) {

}

Я получаю исключение недопустимого аргумента, я предполагаю, что это потому, что я передаю объект Class в метод invoke. Оказывается, Object o фактически инсталлирован, но исключение по-прежнему генерируется.

Разве мы не можем это сделать?


person Alexander Mills    schedule 26.09.2013    source источник


Ответы (3)


Если мы используем

setAccessible(true);

с полем, даже не нужно иметь метод в уравнении

Field f = MuchoStatic.class.getField("staticMember");
Object theStatic = f.get(null);

Конечно, это не рекомендуется ... Возиться с личным - неприятное дело. Не возитесь с другими частными!

скрипка Ideone

person ppeterka    schedule 26.09.2013

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

Конечно же, статично.

Object o = null;
try {
    Method m = MuchoStatic.class.getMethod("getStaticMember");
    m.setAccessible(true);
    o = m.invoke(null);

} catch (Exception e) {
    // don't ignore the exception as it may be trying to tell you something
    throw new AssertionError(e);
}
person Peter Lawrey    schedule 26.09.2013
comment
Спасибо, я пробовал это, но я получаю NPE изнутри метода invoke. Есть ли способ напрямую перейти к полю, не вызывая для него геттер? - person Alexander Mills; 27.09.2013
comment
@AlexMills Да, вам следует сделать метод статическим, поскольку ему не нужен экземпляр. - person Peter Lawrey; 27.09.2013

Вы не требуется экземпляр для вызова статического метода, а поскольку он не принимает никаких аргументов, просто

o = m.invoke(null);

Однако, если ваши классы не находятся в одном пакете, у вас будут проблемы, потому что метод объявлен как частный пакет. Вам может потребоваться позвонить

m.setAccessible(true);

до invoke().

person Sotirios Delimanolis    schedule 26.09.2013