簡體   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