В моем текущем проекте я чувствовал необходимость создать своего рода симулированную систему обратного вызова в 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
нет проблем с его поиском.Помогите?(