0

我们可以使用反射来获取类的静态成员而不在对象实例上调用该方法吗?

换句话说:

 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 对象传递给调用方法。事实证明 Object o 实际上是 instatiated,但仍然抛出异常。

我们不应该能够做到这一点吗?

4

3 回答 3

6

我们可以使用反射来获取类的静态成员而不在对象实例上调用该方法吗?

当然,因为它是静态的。

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);
}
于 2013-09-26T20:29:55.567 回答
2

不需要实例来调用静态方法,因为它不接受任何参数,只需

o = m.invoke(null);

如果您的类不在同一个包中,那么您将遇到问题,因为该方法被声明为包私有。您可能需要致电

m.setAccessible(true);

之前invoke()

于 2013-09-26T20:28:13.560 回答
1

如果我们使用

setAccessible(true);

对于场,甚至不需要方程中的方法

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

当然,建议这样做……修修补补private可不是什么好事。不要修补别人的隐私

Ideone 小提琴

于 2013-09-26T20:35:18.127 回答