【发布时间】:2012-09-12 08:21:25
【问题描述】:
在我当前的项目中,我觉得有必要使用反射在 Java 中创建一种模拟回调系统。但是,我在让我的反思真正发挥作用时遇到了问题。错误代码如下:
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 catch 块。我在上面包含了一些跟踪调试,以显示我的一种方法失败的输出。输出:
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 似乎没有问题找到它。帮助? :(
【问题讨论】:
-
这就是为什么你不依赖反射,它充其量是不可靠的。
-
我不会说它不可靠,但它可能很复杂且效率低。
-
它肯定不如你的编译器可以证明是正确的可靠。 :-)
标签: java reflection