In meinem aktuellen Projekt habe ich das Bedürfnis verspürt, eine Art simuliertes Callback-System in Java mittels Reflektion zu erstellen. Ich habe jedoch Probleme damit, dass mein Spiegelbild funktioniert. Der Code auf Fehler folgt:Java: NoSuchMethodException, wenn Methode eindeutig existiert
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;
}
Wenn ich das Callback
Objekt konstruieren, ich Syntax wie folgt bin mit:
new Callback(this, "myMethod", boolean.class)
Wenn ich versuche, meinen pseudo-Rückruf zu erstellen, es trifft den NoSuchMethodException
Fang Block. Ich habe oben ein Debugging für die Ablaufverfolgung eingefügt, um zu zeigen, dass die Ausgabe einer meiner Methoden fehlschlägt. Die Ausgabe:
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)
Ich konnte das Problem nicht herausfinden, also fing ich an zu jagen, zu wenig Nutzen. Das Beste, was ich finden konnte, war der Versionskonflikt zwischen der kompilierten JAR und der Laufzeit. Jedoch enthält MyJar.jar/META-INF/MANIFEST.MF
Created-By: 1.6.0_02 (Sun Microsystems Inc.)
. Meine IDE läuft C:\Program Files\Java\jdk1.6.0_02\bin\javac.exe
, um mein Projekt zu kompilieren. Ich verwende C:\Program Files\Java\jdk1.6.0_02\bin\java.exe
, um meine JAR zu starten.
Ich bin ratlos, warum Class.getMethod
behauptet, die Methode existiert nicht, aber Class.getMethods
scheint kein Problem zu haben, es zu finden. Hilfe? :(
Deshalb verlassen Sie sich nicht auf Reflection, die bestenfalls unzuverlässig ist. – quantumSoup
Ich würde nicht sagen, dass es unzuverlässig ist, aber es kann kompliziert und ineffizient sein. –
Es ist sicherlich weniger zuverlässig als etwas, das Ihr Compiler beweisen kann, ist richtig. :-) –