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

Java 我们可以使用反射来获取类的静态成员,而不在对象实例上调用该方法吗?,java,class,reflection,Java,Class,Reflection,我们可以使用反射来获取类的静态成员,而不在对象实例上调用该方法吗 换言之: public class MuchoStatic { private static staticMember; getStaticMember(){ return this.staticMember; } } //end class 还有更多的代码: Method m = null; try{ m = MuchoStatic.class.getMethod("g

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

换言之:

 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) {

}
我得到了一个非法参数异常,我假设这是因为我将一个类对象传递到invoke方法中。事实证明,对象o实际上是不稳定的,但仍然会抛出异常

难道我们不能这样做吗?

因为它不接受任何参数,所以

o = m.invoke(null);
但是,如果您的类不在同一个包中,您将遇到问题,因为该方法被声明为包私有。你可能需要打电话

m.setAccessible(true);
在调用()之前

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

当然,因为它是静态的

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);
}
如果我们使用

setAccessible(true);
对于场,甚至不需要方程中的方法

Field f = MuchoStatic.class.getField("staticMember");
Object theStatic = f.get(null);
当然,这不是推荐的。。。修补隐私不是一件好事。不要修补别人的私处


谢谢,我尝试了这个,但是我从invoke方法内部得到了一个NPE。有没有一种方法可以直接访问该字段,而不必对其调用getter?@AlexMills是的,您应该将该方法设置为静态,因为它不需要实例。