File APIs for Java Developers
Manipulate DOC, XLS, PPT, PDF and many others from your application.
http://aspose.com/file-tools
The moose likes Java in General and the fly likes Custom ClassLoader for p13n and ClassCastException problem Big Moose Saloon
  Search | Java FAQ | Recent Topics
Register / Login


Win a copy of The Mikado Method this week in the Agile and other Processes forum!
JavaRanch » Java Forums » Java » Java in General
Reply Bookmark "Custom ClassLoader for p13n and ClassCastException problem" Watch "Custom ClassLoader for p13n and ClassCastException problem" New topic
Author

Custom ClassLoader for p13n and ClassCastException problem

Thierry Belanger
Greenhorn

Joined: Sep 20, 2011
Posts: 1

Greetings,
For starters, I'll just explain the goal I'm trying to achieve.

I want to implement a p13n (personalization) system in an application. Personalized classes would be sub-classes of those in the core packages.
I want to create a custom ClassLoader that will first look in a p13n package for a personalized class, load it if present, or look in the core package and load the default class.

Here is my problem.
I created a simple CustomClassLoader that prefix the classname with "p13n." when loading a class, and upon a classNotFound, it loads the plain classname. This ClassLoader uses the childFirst pattern, obviously.
Let's say that there are no personalized classes yet, only core classes. When I call Class.forName("Blah", true, customClassLoader), my classLoader does the job allright, when inspecting Blah.class.getClassLoader(), it is CustomClassLoader as expected. In the context where Class.forName was called, I put the returned object in a variable of type Class and invoke newInstance(). The moment I try to cast the new Object instance into Blah, there is a ClassCastException. The reason is simple: Blah from CustomClassLoader cannot be cast into Blah from (the current ClassLoader).
Using super-classes or interfaces causes the same thing. If Blah extends SuperBlah or implements iBlah, CustomClassLoader loads its own bytes of Blah AND SuperBlah, and when the current context casts it into SuperBlah, the current ClassLoader kicks in and loads its own bytes of SuperBlah, and BANG! ClassCastException.

Is there a work around for this? I have been searching a lot and found nothing applicable.
I know that I can get away with reflection, but the context where I'm doing all of this has many references to Blah (fake name of course). I would be very complex.
If I use inheritance, is there a way to have CustomClassLoader load Blah by itself, but delegate the loading of SuperBlah to its parent (that is, the current ClassLoader) ? That way, the current context will cast successfully since they're the same class from the same ClassLoader. Can this be done without giving away my childFirst pattern ?

I've tried Thread.currentThread().setContextClassLoader() but to no avail. After calling that, inspecting SuperBlah.class.getClassLoader() does not show CustomClassLoader.

Is it possible in my current context to reference the SuperBlah symbol (I assume as soon as a class name is referenced, that's where the ClassLoader kicks in) and force its loading by a custom ClassLoader ?

If any genius mind can help, it would be a great breakthrough for me!
Thanks to all
 
I agree. Here's the link: http://ej-technologies/jprofiler - if it wasn't for jprofiler, we would need to run our stuff on 16 servers instead of 3.
 
subject: Custom ClassLoader for p13n and ClassCastException problem
 
Similar Threads
class loader for loading singleton classes
java class loader basic question..
how to set different dir to resource bundle file
Difference between creating objects
Loading same class by two different class loader (ClassCastException)