这是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时,我没有看到我的测试类加载器被调用。我这样做了吗?
答案 0 :(得分:0)
这里提出了这个确切的问题Why is custom system classloader not working?。并且在其接受的答案中很好地解释了这种行为的原因。