You would have to create a custom ClassLoader : which returns all Object s wrapped inside a Proxy. The ClassLoader must have a list of all referenced Proxies (keep this list WeakReference d). If you decide to "unload" and thus "reload" any class, you wait untill the class is loaded, find all Proxy's in your list, and replace the actual object.

There are several problems: you need Reflection, to get all private variables and reset the internal state (see setAccesible on Field ). Also multi-threading problems might occour, thus the Proxy must be synchronized: which makes it performing poor.

You can better look for Google's Guice dependency solution, which enables unplugging and reloading modules at runtime. This might be a solution, but way too bloated for a small app. Still: I'm not sure wheter the GC also unloads unused classes.