用于完整应用程序的自定义Classloader,包括系统类

时间:2015-02-11 18:18:48

标签: java classloader urlclassloader

这是java.net package - Override UDP transport的后续行动。我在这里提出一个新问题,因为我正在尝试采用不同的方法解决问题。我经历过类似的问题

java custom classloader: some classes are not loaded by my classloader

How to set my ClassLoader as the JVM's ClassLoader for loading ALL classes (jar classes included)?

但没有运气。所以这就是问题所在。

我试图在我的自定义类加载器中拦截所有类(包括标准JDK类)的加载。想法是在有DatagramSocket类请求时加载扩展类。我没有处理DatagramSocket何时以及如何在应用程序中实例化的句柄,因此我认为这是在我从main方法启动应用程序之前拦截此特定类的加载的最佳方法。为此,我写了TestClassLoader,

public class MyClassLoader extends ClassLoader
{

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

    public Class loadClass(String name) throws ClassNotFoundException
    {
        System.out.println("loading " + name);
        if (name.equals("java.net.DatagramSocket")
                || name.equals("MyDatagramSocket"))
        {
            System.out.println("Loading DatagramSocket class.... " + name);
            return super.loadClass("MyDatagramSocket");
        }
        else
        {
            return super.loadClass(name);
        }
    }
}

和测试程序,

public class TestClassLoader
{
    public static void main(String[] args) throws Exception {

        //See if this invokes myClassLoader
        DatagramSocket dSocket=new DatagramSocket();
        System.out.println("DatagramSocket.classloader = "+DatagramSocket.class.getClassLoader());
        //check the Class loader for the main class
        System.out.println("TestClassLoader.classloader = " + TestClassLoader.class.getClassLoader() );

    }
}

并使用" -Djava.system.class.loader = MyClassLoader"调用测试程序。选项。我看到的输出是

loading java.lang.System 
loading java.nio.charset.Charset 
loading java.lang.String 
loading TestClassLoader 
DatagramSocket.classloader = null 
TestClassLoader.classloader = sun.misc.Launcher$AppClassLoader@130c19b

初始化DatagramSocket时,我没有看到我的测试类加载器被调用。我这样做了吗?

1 个答案:

答案 0 :(得分:0)

这里提出了这个确切的问题Why is custom system classloader not working?。并且在其接受的答案中很好地解释了这种行为的原因。