Reflexionen IllegalArgumentException Ursachen
UPDATE - Um die Frage klarer.
Was ist die mögliche Ursache dafür, dass eine classcastexception-Fehler beim Aufruf einer Methode mit Reflexionen?
Habe ich die folgenden stacktrace als Teil meiner Anwendung beim Versuch, eine Methode aufzurufen, die über Reflexionen.
java.lang.IllegalArgumentException: java.lang.ClassCastException@21fea1fv
at sun.reflect.GeneratedMethodAccessor332.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.....
(remaining is my method stack trace)
Ich habe versucht, ein Beispiel der Klasse und übergeben die verschiedenen Argumente der verschiedenen Arten, aber ich bekomme immer eine diese Ausnahme.
java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
UPDATE -
Hier ist der Beispiel-code, den ich schrieb, um zu versuchen, die Neuerstellung der Ausnahme
Schnittstelle zum erstellen von proxy-Klasse
package my.tests;
public interface ReflectionsInterface {
public abstract void doSomething();
}
Dies ist der test-Klasse
package my.tests;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Reflections implements ReflectionsInterface {
public static void main(String[] args) {
Reflections reflections = new Reflections();
ReflectionsInterface reflectionsProxy = reflections.createProxy(ReflectionsInterface.class);
invokeMethod(reflectionsProxy, "doSomething", null);
}
public <T> T createProxy(Class<T> entityInterface) {
EntityInvocationHandler eih = new EntityInvocationHandler(this);
T cast = entityInterface.cast(Proxy.newProxyInstance(
entityInterface.getClassLoader(), new Class[]{entityInterface}, eih));
return cast;
}
public static void invokeMethod(Object obj, String methodName, Object... args) {
Method[] methods = obj.getClass().getMethods();
try {
for (Method method : methods) {
if (method.getName().equals(methodName)) {
method.invoke(obj, args);
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void doSomething() {
System.out.println("woo");
}
private final static class EntityInvocationHandler implements InvocationHandler,
ReflectionsInterface {
private Reflections reflectionObj;
public EntityInvocationHandler(Reflections reflectionObj) {
super();
this.reflectionObj = reflectionObj;
}
@Override
public void doSomething() {
reflectionObj.doSomething();
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object invoke = method.invoke(this, args);
return invoke;
}
}
}
Ich bin nicht in der Lage zu verstehen, die, wenn ich Sie bekommen würde argument type mismatch und die classcastexception-Fehler verursacht werden würde.
Ich bin nicht in der Lage, neu zu erstellen die Ausnahme und würde gerne wissen, warum es kommt. Jeder beliebige code, der neu erstellt wird, oder eine source code-Referenz werfen dieser Ausnahme in diesem Fall wird gut sein,
Ich habe gegangen durch den Method.class javadocs und source-code, ich bin nicht in der Lage, herauszufinden, warum dieser Fehler kommt.
- Die letzten änderungen, die Sie gemacht, um Ihren code beseitigt haben, die Ausnahme wurde geworfen. Sagen Sie, Sie sind noch immer Fehler, auch mit dieser neuen SSCCE? Wenn nicht, bitte wieder zurück zu den vorherigen code, der eigentlich zeigt das Problem, das Sie haben.
- Der Fehler aus meinem code der Anwendung, die sehr aufwendig und ich kann nicht hier posten. Dies ist mein (gescheiterter) Versuch, neu zu erstellen oder der Fehler verstehen, warum es kommt..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hatte ich neu die
ClassCastException
durch modifing deinem Beispiel-code: InvokeinvokeMethod
mit einem richtigen argument 10000 mal, und dann rufen Sie es mit falschen falsche.Den
main
Methode in derReflections
KlasseDen
invokeMethod
Methode in derReflections
KlasseStack Trace:
Meine Erklärung der
ClassCastException
:Beim aufrufen
invokeMethod
für die erste Zeit, JVM verwenden, eine langsamere route, die einfacher für den Programmierer zum Debuggen (also es ist langsamer!), so wird es eine mehr freundlicheargument type mismatch
Nachricht, wenn Sie geht ein schlechtes argument.Beim aufrufen
invokeMethod
für viel-mal (16 mal genug in meinen tests), JVM erzeugt eineGeneratedMethodAccessor***
in runtime, welches schneller ist und mit weniger Fehler zu überprüfen. Also es wird sich zeigen, wie eine hässlichejava.lang.ClassCastException@603a3e21
Nachricht, wenn Sie geht ein schlechtes argument.ReflectionsInterface
unddoSomething
zurück zu deinem ursprünglichen Beispiel-code-version?main
undinvokeMethod
.Gut, das ist das problem:
Die Sie aufrufen
doInt
, aber du bist die übergabe eineslong
Wert. So ist die Reflexion versucht zu werfenLong
zu einemInteger
ungültig.Ich vermute du meintest:
Ich habe ein wenig den code so ändern, diesen Fehler zu reproduzieren :
Hier ist die Schnittstelle
Fügen Sie die folgende Methode in der Klasse Reflexionen und EntityInvocationHandler, um zu kompilieren. Dann fügen Sie diese Methode in der main(). Ausführen und ich produzieren den Fehler runtime.
Habe ich versucht zu bekommen, un classcastexception-Fehler, aber ich hatte keinen Erfolg.
Es tritt wohl in deinem original-code, da gibt es mehr Objekte und ein Ungültiger Typ ist an die Methode übergeben. Fügen Sie Protokolle, und versuchen, zu Debuggen, zu isoliert die classcastexception-Fehler.