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
).含义:
MyReceiver
并且BaseReceiver
不在同一个包装中;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)
归档时间: |
|
查看次数: |
4972 次 |
最近记录: |