在我當前的項目中,我覺得需要使用反射在Java中創建一種模擬回調系統。不過,我有問題讓我的反思真正起作用。有過錯的代碼如下:Java:NoSuchMethodException當方法明確存在時
public Callback(Object parentObj, String methodName, Class<?>...parameters)
{
if(parentObj == null)
throw new IllegalArgumentException("parentObj cannot be null", new NullPointerException());
Class<?> clazz = parentObj.getClass();
// Trace debugging, see output
for(Method m : clazz.getDeclaredMethods())
if(m.getName().equals("myMethod")) System.out.println (m);
try { this.method = clazz.getMethod(methodName, parameters); }
catch(NoSuchMethodException nsme) { nsme.printStackTrace(); } // Exception caught
catch(SecurityException se) { se.printStackTrace(); }
this.parentObj = parentObj;
this.parameters = parameters;
}
當我構建Callback
對象,我使用的語法如下:
new Callback(this, "myMethod", boolean.class)
當我嘗試創建我的僞回調,它擊中NoSuchMethodException
抓塊。我在上面包含了一些跟蹤調試,以顯示我的某個方法失敗的輸出。輸出:
private void my.package.MyClass.myMethod(boolean)
java.lang.NoSuchMethodException: my.package.MyClass.myMethod(boolean)
at java.lang.Class.getMethod(Class.java:1605)
at my.package.other.Callback.<init>(Callback.java:63)
我無法找出問題出來,所以我開始狩獵,沒有多大用處。我能找到的最好的是提到編譯JAR和運行時之間的版本衝突。但是,MyJar.jar/META-INF/MANIFEST.MF
包含Created-By: 1.6.0_02 (Sun Microsystems Inc.)
。我的IDE正在運行C:\Program Files\Java\jdk1.6.0_02\bin\javac.exe
來編譯我的項目。我使用C:\Program Files\Java\jdk1.6.0_02\bin\java.exe
來運行我的JAR。
我不知道爲什麼Class.getMethod
聲稱該方法不存在,但Class.getMethods
似乎沒有發現它的問題。幫幫我? :(
這就是爲什麼你不依賴於反射,這是最不可靠的。 – quantumSoup 2010-07-08 02:27:59
我不會說這是不可靠的,但它可能是複雜和低效的。 – 2010-07-08 02:30:22
它肯定比你的編譯器證明是正確的東西不可靠。 :-) – 2010-07-08 02:37:08