Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 让JVM使用我自己的类加载器_Java_Classloader - Fatal编程技术网

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

Java 让JVM使用我自己的类加载器,java,classloader,Java,Classloader,我编写了自己的类加载器。 我需要使用我的类加载器加载我的所有类。 我已经通过了以下VM:-Djava.system.class.loader=MyClassLoader 使用我的类加载器只加载包中的第一个引用类。我的包中的其他类正在使用AppClassLoader加载 下面是MyClassLoader的外观: import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.

我编写了自己的类加载器。 我需要使用我的类加载器加载我的所有类。 我已经通过了以下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
其结果是:

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


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

根据我所读的内容,您所做的应该是有效的。我怀疑问题可能出在你的类加载器上。另一种可能是您没有使用类加载器的完全限定类名



作为记录,该方法的javadoc解释了
java.system.class.loader
属性的实际功能。阅读它,看看这是否为您的问题的原因提供了任何线索。

可能的重复:@AlexK-不,它不是重复的。OP清楚地知道这个财产,但它并没有像他期望的那样工作。这里也有同样的问题。强制AppClassLoader是否可行?谢谢您的回答。请检查我编辑的问题
  static {
    System.out.println("My class loader = " + MyClass.class.getClassLoader().getClass());
  }