在我的当前项目中,我感觉有必要使用反射来创建一种模拟回调系统。然而,我在让反射实际起作用方面遇到了问题。以下是有问题的代码:
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
看起来没有找到任何问题。有办法帮忙吗? :(