マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

JARに含まれるクラスを実行時に読み込む その2

前回作りかけたプラグインローダを使っていると、あるクラスを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");
    }
}