要自定義Java類加載器,可以繼承ClassLoader類,并重寫它的findClass()方法。下面是一個簡單的示例:
public class MyClassLoader extends ClassLoader {
@Override
protected Class<?> findClass(String className) throws ClassNotFoundException {
byte[] classData = // 從特定位置加載類的字節碼數據,可以從文件、數據庫等地方獲取
return defineClass(className, classData, 0, classData.length);
}
}
在findClass()方法中,可以根據需要加載類的字節碼數據,然后使用defineClass()方法將字節碼數據轉換為Class對象。
使用自定義的類加載器加載類時,可以通過設置父類加載器來實現層級加載。例如,可以在構造自定義類加載器時,將系統類加載器作為它的父加載器:
MyClassLoader classLoader = new MyClassLoader(ClassLoader.getSystemClassLoader());
Class<?> clazz = classLoader.loadClass("com.example.MyClass");
這樣,當自定義類加載器無法加載類時,會先委托給父類加載器進行嘗試加載。