前回作りかけたプラグインローダを使っていると、あるクラスを2つのクラスローダに読みこまれているというエラーがでた。自分で勝手にクラスを読み込むのはよくないのかなぁ。
ということでURLClassLoader継承して、protectedなaddURLを使うことにした。単純にプラグインファイルへのパスをaddURLしてるだけ。これでClass.forNameのClassLoaderを引数を呼び出せばできそう。forName呼び出すにはクラス名がわからないといけないから、jarに読み込みたいクラスを書いたファイル(ファイル名は全てのプラグインで共通)を用意しないといけないのかな
import java.io.File; import java.net.URL; import java.net.URLClassLoader; public class PluginLoader extends URLClassLoader{ public PluginLoader(){ super(new URL[0], Thread.currentThread().getContextClassLoader()); } public void loadJAR(String filename){ loadJAR(new File(filename)); } public void loadJAR(File file){ try{ addURL(file.toURI().toURL()); }catch(Exception e){ throw new RuntimeException(e); } } public void loadJAR(File[] fileList){ for(File file : fileList) loadJAR(file); } public static void main(String[] args) throws Exception{ PluginLoader loader = new PluginLoader(); loader.loadJAR("plugin.jar"); } }