reflexion reflect method example ejemplos java reflection

reflect - Java: NoSuchMethodException cuando el método existe claramente



reflection java stack overflow (4)

En mi proyecto actual, he sentido la necesidad de crear un tipo 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 en falla sigue:

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 pseudo-devolución de llamada, golpea el bloque catch NoSuchMethodException . 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 cazar, con poco provecho. 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 ejecuta 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? :(


El Javadoc para getMethod no es explícito, pero parece que podría arrojar una excepción NoSuchMethodException para métodos que no son públicos, y su método es privado.


El problema de control de versiones que puede causar NoSuchMethodException no es una diferencia entre las versiones del compilador. Es una diferencia en la versión de (en su caso) MyClass en tiempo de compilación frente a tiempo de ejecución.

Sin embargo, dado que estás utilizando la reflexión, tu problema podría no tener nada que ver con el control de versiones. Ciertamente, eso no explicaría el comportamiento diferente entre getMethod y getDeclaredMethods , porque los está ejecutando contra la misma instancia de Class, por lo tanto, una diferencia de versión no es realmente posible.

¿Estás seguro de que los parámetros coinciden con tu método real?


Necesita que la lista de parámetros sea absolutamente correcta para el método que desea para que la llamada tenga éxito.

He descubierto que los pequeños pasos son importantes cuando se reflexiona porque el compilador no ayuda. Escriba un pequeño fragmento que realmente invoque exactamente el método que desea en este caso particular, y luego, cuando eso funcione, generalícelo en el marco aquí. Me centraría en los parámetros aprobados.


Su método es privado, pero getMethod() solo devuelve el método público.

Necesitas usar getDeclaredMethod() .