En mi proyecto actual, he sentido la necesidad de crear una especie de sistema de devolución de llamada simulada en Java utilizando la reflexión. Sin embargo, tengo problemas para que mi reflejo funcione realmente. El código de la culpa sigue:Java: NoSuchMethodException cuando el método existe claramente
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;
}
Cuando construyo el objeto Callback
, estoy usando una sintaxis como esta:
new Callback(this, "myMethod", boolean.class)
Cuando intento crear mi seudo-llamada de retorno, que golpea la captura NoSuchMethodException
bloquear. He incluido alguna depuración de rastreo arriba para mostrar el error de uno de mis métodos. La salida:
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)
No pude resolver el problema, así que comencé a buscar, con poco éxito. Lo mejor que pude encontrar fue la mención del conflicto de versiones entre el JAR compilado y el tiempo de ejecución. Sin embargo, MyJar.jar/META-INF/MANIFEST.MF
contiene Created-By: 1.6.0_02 (Sun Microsystems Inc.)
. Mi IDE está ejecutando C:\Program Files\Java\jdk1.6.0_02\bin\javac.exe
para compilar mi proyecto. Estoy usando C:\Program Files\Java\jdk1.6.0_02\bin\java.exe
para ejecutar mi JAR.
No entiendo por qué Class.getMethod
afirma que el método no existe, pero Class.getMethods
parece no tener problemas para encontrarlo. ¿Ayuda? :(
Es por eso que no confía en Reflection, que no es confiable en el mejor de los casos. – quantumSoup
No diría que no es confiable, pero puede ser complicado e ineficiente. –
Sin duda es menos confiable que algo que tu compilador puede probar que es correcto. :-) –