我想在Java中使用反射,但我得到一个奇怪的错误。可能是什么问题时,我得到一个错误,指出:IllegalAccessException当使用调用动态方法
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并且无法调用该方法。
这是为什么?
谢谢。
把所有这些小小的东西缝在一起是相当混乱的。如果你可以提供一个简短的,但是完整的程序来证明这个问题,那么将这些东西分类很容易。它不需要做你的真实应用程序所做的一切 - 仅仅足以证明问题。 – 2011-05-28 13:12:44
有关更多详细信息,请参阅本书[Java Puzzlers](http://www.javapuzzlers.com/)中的益智游戏“Reflection Inflection”。该特定的益智游戏可在[本书的在线样本](http://www.javapuzzlers。COM/Java的谜题 - sampler.pdf)。 – 2011-05-28 13:24:10
感谢Richard,示例章节对理解错误非常有帮助! – Carven 2011-05-28 13:54:07