Java ClassLoader change

classloader, java

Solution

As Marko Topolnik points out the context classloader is for use by frameworks. To use the classloader yourself you have to call `loadClass("somepackage.A")` and then use the reflection API to create a new instance of A (`Class.newInstance()`).

You wont be able to use A or its methods in your source directly since the calling code does not know A - it uses a different classloader. An interface or baseclass of A that can be loaded by the normal classloader can be used to avoid reflection.

interface AIF{
        void someMethod();
 }
class A implements AIF{
      public void someMethod(){}
 }


public void test(){
     MyLoader loader = new MyLoader();
     Class cla = loader.loadClass("A");
     AIF a = (AIF) cla.newInstance();
     a.someMethod();

 }

Problem

I have some class `A`: ``` public class A { public A(String str) { System.out.println("Create A instance: " + str); } public void methodA() { System.out.println("#methodA1()"); } } ``` And my class loader implementation: ``` public class MyClassLoader extends ClassLoader { public MyClassLoader() { super(); } @Override public synchronized Class<?> loadClass(String name) throws ClassNotFoundException { System.out.println("Load: " + name); return super.loadClass(name); } } ``` And now I try to change default class loader in current thread: ``` import java.util.ArrayList; import java.util.List; public class ChangeLoaderTest { public static void main(String[] args) { // Save class loader so that we can restore later. ClassLoader oldLoader = Thread.currentThread().getContextClassLoader(); MyClassLoader newLoader = new MyClassLoader(); try { // Set new classloader. Thread.currentThread().setContextClassLoader(newLoader); // My class. A a = new A("1"); a.methodA(); // Standard Java class. List<Integer> list = new ArrayList<Integer>(); list.add(2); list.add(3); } finally { // Restore. Thread.currentThread().setContextClassLoader(oldLoader); } } } ``` And `ChangeLoaderTest` output: ``` Create A instance: 1 #methodA1() ``` No one ``` Load: ... ``` Why? How I can change `ClassLoader` into some thread?

Original source