Given the vast amount of crap that we as programmers need to know these days (which is growing exponentially) I typically wrap unknowns into a black box and add them to my list to check out at a later time.
java.lang.reflect.Proxy fell onto this list.
I typically associated a “magic” factor to anything that’s in the core Java classes. Take for example how NIO’s
InterruptibleChannel interacts with
Thread. I still want to know how Sun expects third parties to use the SPI to create other NIO implementations but that’s another battle for another day.
I assumed incorrectly that
Proxy had some magic tie-ins to the JVM that allowed it to masquerade as another class. Instead,
Proxy actually goes the sane route. It generates a class (as a
byte array) using reflection to inspect the specified interfaces. The class is then loaded using something very similar to
ClassLoader.defineClass() (why it does not just use
ClassLoader is not known but if there is one thing that I’ve learned over there years is that programmers love to keep secrets). By default, these generated files are not persisted to disk. You can set the system property
true to save the files for examination (I do not know where they are saved to).
It’s actually unfortunate that
Proxy does not use JVM magic since then it might be possible to create a proxy to a class (rather than just interfaces) which would provide a truely useful generic proxy mechanism (facilitating AOP, for example).