Java クラスローダーをカスタマイズする方法
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メソッドによりバイトコードデータがクラスオブジェクトに変換される。
カスタムクラスローダーでクラスをロードする際には、親クラスローダーを設定することで階層化されたロードを実現できます。例えば、カスタムクラスローダーを構築する際に、システムクラスローダーをその親ローダーとして設定できます。
MyClassLoader classLoader = new MyClassLoader(ClassLoader.getSystemClassLoader());
Class<?> clazz = classLoader.loadClass("com.example.MyClass");
カスタムクラスローダーでクラスがロードできない場合は、まずは親クラスローダーにロードを試行してもらうように委任します。