调用java子类保护方法时方法访问被拒绝

Sag*_*ann 7 java reflection methods illegalaccessexception

我有以下问题:我有一个类,尝试使用反射来调用其受保护的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() {
    }

}
Run Code Online (Sandbox Code Playgroud)

派生的具体类:

class MyReceiver extends BaseReceiver {
    @Override
    protected void testMethod() {
        // display error message
    }
}
Run Code Online (Sandbox Code Playgroud)

Fra*_*eth 17

受保护的方法只能从包,类本身或扩展它的类中访问.

据我所知(基于Exception)你的扩展类(MyReceiver)在另一个包中,然后是超类(BaseReceiver).含义:

  1. MyReceiver并且BaseReceiver不在同一个包装中;
  2. BaseReceiver不延伸MyReceiver;

现在,正如您在代码中看到的那样,您正在做:method = this.getClass().getDeclaredMethod("testMethod");这似乎没问题,但这不是您想要的.由于此方法将返回MyReceiver.testMethod()方法,并且无法访问BaseReceiver(正如您所看到的那样this.getClass(),在这种情况下返回实例类的内容MyReceiver).

你可以做点什么:

...
method = BaseReceiver.class.getDeclaredMethod("testMethod");
...
Run Code Online (Sandbox Code Playgroud)

有了这个,你指示你想要在BaseReceiver类上声明受保护的方法.当然,稍后当您调用它时,method.invoke(this);将调用重写的方法.

但是在这种情况下使用反射是没有意义的,因为你有testMethod()可用的,并且调用它(简单如this.testMethod())你将调用被覆盖的反射.

另一种可能性是setAccessible(true)如下方法:

method = getClass().getDeclaredMethod("testMethod");
method.setAccessible(true);
method.invoke(this);
Run Code Online (Sandbox Code Playgroud)