Java 9+ change default class loading with modules

Viewed 339

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?

0 Answers
Related