It's something you could arrange if you wanted to, but it could be pretty complicated! Swapping individual classes within a VM and having multiple classloaders could be very nuanced to debug. I suspect it would also complicate usage of concurrency and primitives -- for example, there will be a separate EventBus for each classloader, rather than one for the application. The app will need to embrace subtlety like that to be correct. I'd almost be tempted to consider the two classloader roots to be two separate apps in the same process, but they'd need to share the same file descriptors for network communication and logging. Urk.
It's a neat idea though. Do you know of any frameworks that would make the idea easier to implement? It sounds loosely similar to the Unix availability concept of passing off the listening socket to a new instance of the process, while allowing the old processes to linger until they finish serving their requests.
All other things equal, I favor architectural approaches where I can take any machine offline safely and effortlessly since I tend to need to handle that case anyway for availability reasons.