user127377
user127377

Reputation: 151

Class & ClassLoader

I have a Custom Classloader : CustomClassLoader(extends ClassLoader)

I have a class : IntegerPrint

I load my class with my Custom ClassLoader. I was expecting SOPs in the below code to return the same value. But the first SOP prints "sun.misc.Launcher$AppClassLoader@.." & second SOP prints "CustomClassLoader@.."

Why it happens so? Please advise.

public class IntegerPrinterTest {
    public static void main(String[] args) throws Exception {
        CustomClassLoader loader = new CustomClassLoader(IntegerPrinterTest.class.getClassLoader());
        Class<?> clazz = loader.loadClass("IntegerPrinter");
        System.out.println(IntegerPrinter.class.getClassLoader());
        System.out.println(clazz.getClassLoader());
    }
}

Upvotes: 0

Views: 116

Answers (2)

nablex
nablex

Reputation: 4767

The first call:

IntegerPrinter.class.getClassLoader()

Will actually do:

IntegerPrinterTest.class.getClassLoader().loadClass("IntegerPrinter")

So it totally ignores your custom classloader. In other words: your own classloader is not actually used for any objects you create using native calls like "new" etc. To do that it should be responsible for loading the IntegerPrinter class as well.

It is rather circumspect (and in general useless) to do it in the same class but you could do:

Class<?> clazz = loader.loadClass("IntegerPrinterTest");
clazz.getMethod("main").invoke(null);

(note this code is not tested but should approximate something that works)

Upvotes: 2

Ingo
Ingo

Reputation: 36339

What did you expect? In

System.out.println(IntegerPrinter.class.getClassLoader());

you create a

 Class<IntegerPrint> 

object, and surely, its class (Class) must have been loaded by some class loader. It takes no genius to imagine that Class must have been loaded very early, even before your code even gains control.

Please run your example with

java  -verbose:class ....

to see which classes are laoded in what order.

Upvotes: 2

Related Questions