2009-06-21 20 views
8

Je reçois des traces de pile comme ceci:Qu'est-ce que GeneratedMethodAccessor1,2, etc et pourquoi pourraient-ils ne pas être trouvés?

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 

Que sont GeneratedMethodAccessor1, GeneratedMethodAccessor2, GeneratedMethodAccessorN et ce qui pourrait leur causer de ne pas trouver? Je fais une réécriture de code d'octet au moment de l'exécution, mais seulement avant que la classe ne soit chargée, et les premiers appels de plusieurs réflexions fonctionnent correctement. Je me demande si cela se produit après que le compilateur JIT ait eu mon code, mais je n'ai même pas une très bonne idée de la façon de commencer le débogage.

Répondre

7

GeneratedMethodAccessor### sont des classes générées lors de l'exécution par l'implémentation de réflexion pour appeler des méthodes et des constructeurs. Cela forme un pont de bytecode à partir des instances de Method ou Constructor à la méthode ou au constructeur réel. Plus d'informations sont disponibles dans le code source.

La désérialisation fait également quelque chose de similaire, partageant une partie du même mécanisme, pour appeler le constructeur non-Serializable le plus dérivé.