调用受java子类保护的方法时拒绝方法访问
我有以下问题:我有一个类,试图使用反射调用它自己的一个受保护方法,但我遇到了一个异常: java.lang.IllegalAccessException:对方法的访问被拒绝 有人能解释一下吗 基类:调用受java子类保护的方法时拒绝方法访问,java,reflection,methods,illegalaccessexception,Java,Reflection,Methods,Illegalaccessexception,我有以下问题:我有一个类,试图使用反射调用它自己的一个受保护方法,但我遇到了一个异常: java.lang.IllegalAccessException:对方法的访问被拒绝 有人能解释一下吗 基类: public abstract class BaseReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // i
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
}
}
受保护的方法只能从包、类本身或扩展它的类访问 据我所知(基于
异常
),您的扩展类(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)调用它时代码>您将调用重写的方法
但是在这种情况下使用反射是没有意义的,因为您有可用的testMethod()
,并且调用它(简单到这个.testMethod())您将调用重写的反射
另一种可能性是在如下方法上设置可访问(true)
:
method = getClass().getDeclaredMethod("testMethod");
method.setAccessible(true);
method.invoke(this);
BaseReceiver
中的this
的静态类型是BaseReceiver
,因此您通常无法访问MyReceiver.testMethod
。除此之外,反射API检查的是调用方类,而不是实例(考虑到反射的用途,实例本身就是一个坚果)
您应该能够使用BaseReceiver.testMethod
反射在大多数(但不是所有)情况下都是一个坏主意。它是否与BaseReceiver.class.getDeclaredMethod
一起工作?@KazekageGaara:另一个问题是关于无法以其他方式访问的方法。在这里,他尝试调用自己的方法。哦,很抱歉。我只是觉得它可能有用。+1直接调用testMethod()
。反思在这里是个坏主意。