Solution for the ClassCastException due to ClassLoader issue

ravana picture ravana · Aug 16, 2011 · Viewed 18.5k times · Source

I have two ClassLoaders which loads the same class. So, obviously these can't cast to one another. But I need to access an object created in the other ClassLoader.

I have access to both ClassLoaders. How can I use that object in the other class? I don't need to cast the object to match to the current ClassLoader.

But the issue is that the returned object's type is Object. So, I have to cast down that object to access some methods. How can I do that? Normal cast like the following causes ClassCastException, which I already know.

Mojo mojo = (Mojo) descriptor.getMojo();

descriptor#getMojo() returns an object of type Mojo but the method returns Object. How can do this?

Let me know if you need further info.

I've read all the theories about classloading, but none has specified a proper solution for this.

Answer

Sanjay T. Sharma picture Sanjay T. Sharma · Aug 16, 2011

AFAIK, no, you can't cast an object of a class loaded by one class-loader in another class loader.

  • One solution would be to create a "common" class-loader which loads the classes to be used by your custom classloaders. So in your case, you'd have a new classloader which would load the given class and your custom classloaders would extend this classloader.
  • Another solution would be to pass around the "serialized" state between the two classloaders. Serialize one instance to a byte array and reconstruct the object in the other classloader by de-serializing the object stream.