Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用受java子类保护的方法时拒绝方法访问_Java_Reflection_Methods_Illegalaccessexception - Fatal编程技术网

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

调用受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

我有以下问题:我有一个类,试图使用反射调用它自己的一个受保护方法,但我遇到了一个异常: 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
    }
}

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

据我所知(基于
异常
),您的扩展类(
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()
    。反思在这里是个坏主意。