views:

58

answers:

3

I am working with a Java framework that generates some (proxy) classes at runtime, using a custom ClassLoader. I would like to get for any such class that the custom ClassLoader returns from loadClass(..) the raw byte array that corresponds to this class. Is this possible? I know that if a class exists as a resource then you can use an input stream to load the class in binary format but how can I go about this if the class is generated at runtime?

+3  A: 

If you replace the custom ClassLoader with your own, you can add some mechanism for saving the raw bytes yourself.

Adam Goode
A: 

Classes in the ClassLoader are created by the defineClass() method. If you already have a custom classloader you can simply override all of the defineClass() methods. To that method you are passed a byte[] containing the bytes of the class. Store these and you can access them later however you need to for your application.

See [defineClass() Java Documentation][1] for more information.

[1]: http://java.sun.com/javase/6/docs/api/java/lang/ClassLoader.html#defineClass(java.lang.String, byte[], int, int)

Chris Dail
All the defineClass methods are final.
bkail
+1  A: 

Register a ClassFileTransformer. Rather than modifying the bytes, record the data you need.

bkail
Yep, we actually ended up doing that a few weeks ago. It works.