让JVM使用我自己的类加载器

我写了我自己的类加载器。 我需要使用我的类加载器来加载所有的类。 我已经通过VM了以下内容: -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

有没有一种方法可以强制使用我的类加载器?


根据我读过的内容,你所做的事情应该能够发挥作用。 我怀疑这个问题可能在你的类加载器中。 另一种可能性是你没有使用类加载器的全限定类名。

(我对“AppClass loader”的含义感到困惑,也许你可以在这个问题上进行编辑。)


为了记录, ClassLoader.getSystemClassLoader()方法的javadoc解释了java.system.class.loader属性实际执行的操作。 阅读它,看看是否能为你的问题提供任何线索。

链接地址: http://www.djcxy.com/p/9993.html

上一篇: Make JVM use My Own Class Loader

下一篇: CMake and Visual Studio resource files