Cosa sono GeneratedMethodAccessor1,2, ecc. E perché non possono essere trovati?
-
06-07-2019 - |
Domanda
Ricevo tracce dello stack in questo modo:
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
Cosa sono GeneratedMethodAccessor1, GeneratedMethodAccessor2, GeneratedMethodAccessorN e quali potrebbero essere la causa del loro mancato rilevamento? Sto eseguendo una riscrittura del codice byte in fase di esecuzione, ma solo prima che la classe venga caricata e le prime numerose chiamate tramite reflection funzionano correttamente. Mi chiedo se questo accada dopo che il compilatore JIT ha acquisito il mio codice, ma non ho nemmeno una buona idea di come iniziare a eseguire il debug.
Soluzione
GeneratedMethodAccessor ###
sono classi generate in fase di esecuzione dall'implementazione di reflection per chiamare metodi e costruttori. Questo forma un ponte bytecode dalle istanze di Method
o Constructor
al metodo o costruttore effettivo. Ulteriori informazioni sono disponibili nel codice sorgente.
Anche la deserializzazione fa qualcosa di simile, condividendo alcuni degli stessi meccanismi, per invocare il costruttore non serializzabile
più derivato.