簡體   English   中英

調用java子類保護方法時方法訪問被拒絕

[英]method access denied while calling java subclass protected method

我有以下問題:我有一個類,嘗試使用反射來調用其受保護的OWN方法之一,並且我得到一個異常:java.lang.IllegalAccessException:訪問方法被拒絕

有人可能會對此有所了解嗎?

基類:

public abstract class BaseReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // invoke the correct event method:
        Method method;
        try {
            method = this.getClass().getDeclaredMethod("testMethod");
            method.invoke(this);
        } catch (Throwable ex) {
             // ... display exception message
        }
    }

    protected void testMethod() {
    }

}

派生的具體類:

class MyReceiver extends BaseReceiver {
    @Override
    protected void testMethod() {
        // display error message
    }
}

受保護的方法只能從包,類本身或擴展它的類中訪問。

據我所知(基於Exception ),你的擴展類( MyReceiver )在另一個包中,然后是超類( BaseReceiver )。 含義:

  1. MyReceiverBaseReceiver不在同一個包中;
  2. BaseReceiver不擴展MyReceiver ;

現在,正如您在代碼中看到的那樣,您正在執行: method = this.getClass().getDeclaredMethod("testMethod"); 這似乎沒問題,但這不是你想要的。 由於此方法將返回MyReceiver.testMethod()方法,並且無法從BaseReceiver訪問(因為您可以看到您正在使用this.getClass() ,因此返回實例類,在本例中為MyReceiver )。

你可以做點什么:

...
method = BaseReceiver.class.getDeclaredMethod("testMethod");
...

有了這個,你指示你想要在BaseReceiver類上聲明受保護的方法。 當然,稍后使用method.invoke(this);調用它時method.invoke(this); 你將調用重寫的方法。

但是在這種情況下使用反射是沒有意義的,因為你有testMethod()可用,並且調用它(簡單如this.testMethod())你將調用被覆蓋的反射。

另一種可能性是對方法設置setAccessible(true) ,如:

method = getClass().getDeclaredMethod("testMethod");
method.setAccessible(true);
method.invoke(this);

靜態類型的thisBaseReceiverBaseReceiver ,所以你通常不會訪問MyReceiver.testMethod 除此之外,反射API檢查調用者類,而不是實例(考慮到反射是什么,這是堅果本身)。

您應該能夠使用BaseReceiver.testMethod

在使用它的大多數(但不是全部)情況下,反射是一個壞主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM