在我当前的项目中,我感到有必要使用反射在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
找到它似乎没有问题。帮助?:(
你的方法是私有方法,但getMethod()
仅返回公共方法。
你需要使用getDeclaredMethod()
。
是的!这样可以解决问题,而不必强迫我使用公共方法。谢谢!
3年后...就我而言,这很有意义。尽管我开始在docs.oracle.com/javase/1.5.0/docs/api/java/lang/…,java.lang.Class ...)上阅读这两种方法的文档,但它们并未提及此类信息。也许您调查了代码?对你有好处。+1
连续2个小时将我的头撞在墙上。谢啦 !
很棒的命名约定Java ... getPrivateMethod .. lordy怎么样
这对我有所帮助,但反过来。我有一个公共方法,我试图用getDeclaredMethod()调用,但找不到。交换到getMethod(),它可以工作