I tried to change the default classloader in a modular Java9+ project but was unable to make it work. If I use traditional non modular main class, then the classloader is used :
$ java -Djava.system.class.loader="CustomLoader" test.MainClass
I'll then have messages from several overriden methods in my custom classloader.
but if I used a module schema like :
$ java -Djava.system.class.loader="CustomLoader" -p ... -m module/test.MainClass
then nothing happens, except the message from the constructor with the `delegate argument. The loading takes place (with the standard default I presume) and the application runs correctly.
The CustomLoader I used is:
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public class CustomClassLoader extends ClassLoader {
public CustomClassLoader() {
System.out.println("empty");
}
public CustomClassLoader(ClassLoader delegate) {
super(delegate);
System.out.println("delegate");
}
public CustomClassLoader(String name,ClassLoader delegate) {
super(delegate);
System.out.println("name delegate");
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
System.out.println(getParent());
System.out.println("Find "+name);
return super.findClass(name);
}
@Override
protected Class<?> findClass(String module,String name) {
System.out.println("Find "+module+" : "+name);
return super.findClass(module,name);
}
@Override
protected String findLibrary(String name) {
System.out.println("Find Library "+name);
return super.findLibrary(name);
}
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
System.out.println("Loading "+name);
return super.loadClass(name);
}
@Override
public Class<?> loadClass(String name,boolean resolve) throws ClassNotFoundException {
System.out.println("Loading "+name);
return super.loadClass(name,resolve);
}
}
Then how to short circuit the classloading in a Java9+ modular project?