繁体   English   中英

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

[英]Can we use reflection to get a static member of a class without invoking that method on an object instance?

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

换一种说法:

 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方法。 事实证明,对象o实际上是无效的,但是仍然引发异常。

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

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

当然,因为它是静态的。

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);
}

不需要实例来调用静态方法,并且由于它不需要任何参数,因此只需

o = m.invoke(null);

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

m.setAccessible(true);

invoke()之前。

如果我们使用

setAccessible(true);

在现场,甚至不需要方程中的方法

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

当然, 建议这样做。与私人进行修补不是一件好事。 不要修补其他私人

伊迪奥小提琴

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM