![](/img/trans.png)
[英]Java: calling a super class' protected method from a subclass - not visible?
[英]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
)。 含義:
MyReceiver
和BaseReceiver
不在同一個包中; 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);
靜態類型的this
在BaseReceiver
是BaseReceiver
,所以你通常不會訪問MyReceiver.testMethod
。 除此之外,反射API檢查調用者類,而不是實例(考慮到反射是什么,這是堅果本身)。
您應該能夠使用BaseReceiver.testMethod
。
在使用它的大多數(但不是全部)情況下,反射是一個壞主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.