gpt4 book ai didi

java - 使用调用动态方法时出现 IllegalAccessException

转载 作者:搜寻专家 更新时间:2023-10-30 21:21:01 25 4
gpt4 key购买 nike

我正在尝试在 Java 中使用反射,但出现了一个奇怪的错误。当我收到以下错误时可能会出现什么问题:

java.lang.IllegalAccessException: Class com.myapp.core.utils.EventDispatcher can not access a member of class appApp$1 with modifiers "public"
at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)

我只是想创建我自己的 EventDispatcher 类,在其中,我使用反射的部分,也是导致问题的代码行是:

public void dispatchEvent(Event e, String callMethName) {
IEventListener list = ((IEventListener)listeners[i]);
list.getClass().getMethod(callMethName, Event.class).invoke(list, e);
}

在我的主类中,我有一些调用 addListener 的东西,它会以这种方式将监听器添加到 EventDispatcher 类的列表中:

try {
obj.addListener("onTestHandler", new MyTestEventListener(){
@Override
public void onTestHandler(Event e) {
System.out.println("hello!");
}
});
} catch (SecurityException e) {
e.printStackTrace();
}

因此第一个参数“onTestHandler”将传递给 EventDispatcher 类,并最终作为 dispatchEvent 方法中参数 callMethName 的一部分,该方法将动态调用该方法。

方法的传递和一切都是正确的。不知何故,有反射的部分有问题。好像能找到方法。但由于某种原因,抛出 IllegalAccessException 且无法调用该方法。

为什么会这样?

谢谢。

最佳答案

我怀疑实现 MyTestEventListener 的匿名类 (appApp$1) 具有包可见性,并且反射代码在另一个包中。

对于这段代码:

package foo.p1;
public class Target {
public static interface Foo {
public void bar();
}

public static Foo newFoo() {
return new Foo() {
@Override
public void bar() {
}
};
}
}

此代码将失败,因为 newFoo() 返回的运行时类型不是公共(public)类:

package foo.p2;
import foo.p1.Target;
public class Main {
public static void main(String[] args) throws Exception {
Target.Foo foo = Target.newFoo();
foo.getClass()
.getMethod("bar")
.invoke(foo);
}
}

这可以通过将方法设置为可访问来克服:

Target.Foo foo = Target.newFoo();
Method m = foo.getClass()
.getMethod("bar");
m.setAccessible(true);
m.invoke(foo);

或者使用公共(public)接口(interface)中的方法:

Target.Foo foo = Target.newFoo();
Target.Foo.class.getMethod("bar")
.invoke(foo);

关于java - 使用调用动态方法时出现 IllegalAccessException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6161790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com