這是一個跟進java.net package - Override UDP transport。我在這裏提出了一個新問題,因爲我正在嘗試一種解決問題的方法。我已經通過simlar問題了定製Classloader包括系統類的完整應用程序
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何時以及如何在應用程序中實例化,因此我認爲這是在我從主要方法啓動應用程序之前截取此特定類的加載的最佳方法。爲此我寫了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 = [email protected]
我沒有看到我的測試類加載器在DatagramSocket初始化時被調用。我做對了嗎?
如果您試圖攔截類加載,是否考慮使用自定義的javaagent? – 2015-02-11 18:22:03
不,我沒有嘗試過自定義Java代理。我是否可以使用javaagent實現相同的結果,即每當DatagramSocket創建時實例化我的擴展類?我不想修改標準DatagramSocket,因爲這可能會導致一些授權問題。 – user572964 2015-02-11 19:38:07
必須在JVM啓動時應用Java代理。但是您可以在加載類時進行修改。這並不容易,但是您可以用自己的實現來替換標準實現。 – 2015-02-11 22:13:29