【问题标题】:method access denied while calling java subclass protected method调用 java 子类受保护方法时方法访问被拒绝
【发布时间】:2012-06-25 21:43:00
【问题描述】:

我有以下问题:我有一个类,试图使用反射来调用它的一个 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
    }
}

【问题讨论】:

  • 它可以与BaseReceiver.class.getDeclaredMethod 一起使用吗?
  • @KazekageGaara:另一个问题是关于无法以其他方式访问的方法。在这里,他尝试调用自己的方法。
  • 那么对不起。我只是觉得它可能有用。

标签: java reflection methods illegalaccessexception


【解决方案1】:

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

据我所知(基于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); 调用它时,您将调用被覆盖的方法。

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

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

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

【讨论】:

  • +1 直接拨打testMethod()。反射在这里是个坏主意。
【解决方案2】:

BaseReceiverthis 的静态类型是BaseReceiver,因此您通常无法访问MyReceiver.testMethod。除此之外,反射 API 检查调用者类,而不是实例(考虑到反射的用途,这本身就是疯了)。

你应该可以使用BaseReceiver.testMethod

在大多数(但不是全部)使用反射的情况下,反射是一个坏主意。

【讨论】:

    猜你喜欢
    • 2019-04-25
    • 2014-04-17
    • 2015-11-04
    • 2010-12-18
    • 2020-07-26
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    相关资源
    最近更新 更多