我想在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