Was sind GeneratedMethodAccessor1,2, etc. und warum könnten sie nicht gefunden werden?
-
06-07-2019 - |
Frage
Ich erhalte Stapel Spuren wie folgt aus:
java.lang.NoClassDefFoundError: sun/reflect/GeneratedMethodAccessor1
at sun.reflect.GeneratedMethodAccessor1.<clinit>(Unknown Source)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:381)
at java.security.AccessController.doPrivileged(Native Method)
at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:377)
at sun.reflect.MethodAccessorGenerator.generateMethod(MethodAccessorGenerator.java:59)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:28)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at edu.tufts.cs.testsim.LogicalProcess.dispatchMessage(LogicalProcess.java:214)
at edu.tufts.cs.testsim.LogicalProcess.processForward(LogicalProcess.java:287)
at edu.tufts.cs.testsim.LogicalProcess.doOperation(LogicalProcess.java:423)
at edu.tufts.cs.testsim.LogicalProcess.run(LogicalProcess.java:434)
at java.lang.Thread.run(Thread.java:637)
Caused by: java.lang.ClassNotFoundException: sun.reflect.GeneratedMethodAccessor1
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:316)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:288)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:374)
... 19 more
Was sind GeneratedMethodAccessor1, GeneratedMethodAccessor2, GeneratedMethodAccessorN und was vielleicht verursachen sie nicht gefunden werden? Ich mache ein paar Byte-Code zur Laufzeit umgeschrieben, sondern nur vor der Klasse geladen wird, und die ersten Anrufe durch Reflexion funktionieren. Ich frage mich, ob dies geschieht, nachdem der JIT-Compiler einen Einfluß von meinem Code bekommt, aber ich habe nicht einmal eine sehr gute Vorstellung davon, wie diese starten Debuggen.
Lösung
GeneratedMethodAccessor###
sind Klassen zur Laufzeit durch die Reflexion Implementierung generierten Methoden und Konstrukteuren zu nennen. Diese bilden eine Brücke von Bytecode-Instanzen von Method
oder Constructor
der tatsächlichen Methode oder Konstruktor. Weitere Informationen finden Sie im Quellcode zur Verfügung.
Deserialisation tut auch etwas ähnliches, die zum Teil den gleichen Mechanismus zu teilen, die am meisten abgeleitete Nicht-Serializable
Konstruktor aufzurufen.