Заставить JVM использовать My Own Class Loader - PullRequest
8 голосов
/ 18 ноября 2011

Я написал свой собственный загрузчик классов.Мне нужно, чтобы все мои классы загружались с помощью моего загрузчика классов.Я передал ВМ следующее: -Djava.system.class.loader=MyClassLoader

Только первый ссылочный класс в моем пакете загружается с помощью моего загрузчика классов.Другие классы в моем пакете загружаются с использованием AppClassLoader.

Вот как выглядит MyClassLoader:

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Enumeration;

public class MyClassLoader extends ClassLoader {

  public MyClassLoader() {
    super(MyClassLoader.class.getClassLoader());
  }

  public MyClassLoader(ClassLoader parent) {
    super(parent);
  }

  @Override
  public Class<?> loadClass(String name) throws ClassNotFoundException {
    System.out.println("MyClassLoader is loading " + name);
    return super.loadClass(name);
  }//loadClass

  @Override
  public synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
    System.out.println("MyClassLoader is loading " + name + " with resolve = " + resolve);
    return super.loadClass(name, resolve);
  }

  @Override
  protected Class<?> findClass(String name) throws ClassNotFoundException {
    System.out.println("MyClassLoader findClass " + name);
    return super.findClass(name);
  }

  @Override
  protected URL findResource(String name) {
    System.out.println("MyClassLoader findResource " + name);
    return super.findResource(name);
  }

  @Override
  protected Enumeration<URL> findResources(String name) throws IOException {
    System.out.println("MyClassLoader findResources " + name);
    return super.findResources(name);
  }

  @Override
  protected Package getPackage(String name) {
    System.out.println("MyClassLoader getPackage " + name);
    return super.getPackage(name);
  }

  @Override
  public URL getResource(String name) {
    System.out.println("MyClassLoadergetResource " + name);
    return super.getResource(name);
  }

  @Override
  public InputStream getResourceAsStream(String name) {
    System.out.println("MyClassLoader getResourceAsStream " + name);
    return super.getResourceAsStream(name);
  }

  @Override
  public Enumeration<URL> getResources(String name) throws IOException {
    System.out.println("MyClassLoader getResources " + name);
    return super.getResources(name);
  }
}//MyClassLoader

У меня есть этот код в статическом блоке в одном из моих классовкоторые загружаются:

  static {
    System.out.println("My class loader = " + MyClass.class.getClassLoader().getClass());
  }

Вывод этого был:

My class loader = class sun.misc.Launcher$AppClassLoader

Есть ли способ, которым я могу принудительно использовать мой загрузчик классов?

1 Ответ

3 голосов
/ 18 ноября 2011

Исходя из того, что я прочитал, то, что вы сделали должно работать.Я подозреваю, что проблема может быть в вашем загрузчике классов.Другая возможность заключается в том, что вы не использовали полностью квалифицированное имя класса вашего загрузчика классов.

(Я озадачен тем, что вы подразумеваете под "загрузчиком AppClass". Возможно, вы могли бы уточнить вредактирование вопроса.)


Для записи javadoc для метода ClassLoader.getSystemClassLoader() объясняет, что на самом деле делает свойство java.system.class.loader.Прочтите его и посмотрите, поможет ли это понять причину ваших проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...