cron に似たものを作る際に必要なものがある。
スケジュールしたい処理に必要なCLASSPATH をXMLに書くことになるので、途中から、CLASSPATH を追加しなければならない。
そこで、動的なCLASSPATH は追加は、以下のようにする、
URL url;
// URLClassLoaderのprotectedメソッドaddURLを取得する
Method method = URLClassLoader.class.getDeclaredMethod("addURL",new Class{URL.class});
// アクセス可能に変更する
method.setAccessible(true);
// システムクラスローダーをURLClassLoaderと仮定し、addURLをコールする
method.invoke(ClassLoader.getSystemClassLoader(),new Object { url });
これが基本で。これを、ユーティリティクラスにするなら、、「続きを読むに。。。」
なんか話が逸れてしまったが。
========
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
/**
* Classパス追加.
* URLClassLoader で、classpath を追加する。
*/
public final class ClasspathHacker{
private ClasspathHacker(){}
/**
* 指定文字列をCLASSPATH に追加.
* @param path path文字列
*/
public static void addFile(String path) throws MalformedURLException,NoSuchMethodException,IllegalAccessException,InvocationTargetException{
addFile(new File(path));
}
/**
* 指定文字列を任意クラスローダでCLASSPATH に追加.
* @param path path文字列
* @param classLoader 任意クラスローダ、ClassLoader.getSystemClassLoader()など
*/
public static void addFile(String path,ClassLoader classLoader) throws MalformedURLException,NoSuchMethodException,IllegalAccessException,InvocationTargetException{
addFile(new File(path),classLoader);
}
/**
* 指定File をCLASSPATH に追加.
* @param file 対象File
*/
public static void addFile(File file) throws MalformedURLException,NoSuchMethodException,IllegalAccessException,InvocationTargetException{
addURL(file.toURL());
}
/**
* 指定File を任意クラスローダでCLASSPATH に追加.
* @param file 対象File
* @param classLoader 任意クラスローダ、ClassLoader.getSystemClassLoader()など
*/
public static void addFile(File file,ClassLoader classLoader) throws MalformedURLException,NoSuchMethodException,IllegalAccessException,InvocationTargetException{
addURL(file.toURL(),classLoader);
}
/**
* 指定 URL をCLASSPATH に追加.
* @param url URL形式、ファイルなら、file:/c/:/xx/xx.jar
*/
public static void addURL(URL url) throws NoSuchMethodException,IllegalAccessException,InvocationTargetException{
// URLClassLoaderのprotectedメソッドaddURLを取得する
Method method = URLClassLoader.class.getDeclaredMethod("addURL",new Class{URL.class});
// アクセス可能に変更する
method.setAccessible(true);
// システムクラスローダーをURLClassLoaderと仮定し、addURLをコールする
method.invoke(ClassLoader.getSystemClassLoader(),new Object { url });
}
/**
* 指定 URL を任意クラスローダでCLASSPATH に追加.
* @param url URL形式、ファイルなら、file:/c/:/xx/xx.jar
* @param classLoader 任意クラスローダ、ClassLoader.getSystemClassLoader()など
*/
public static void addURL(URL url,ClassLoader classLoader) throws SecurityException,NoSuchMethodException,IllegalArgumentException,IllegalAccessException,InvocationTargetException{
Method method = URLClassLoader.class.getDeclaredMethod("addURL",new Class{URL.class});
method.setAccessible(true);
method.invoke(classLoader,new Object { url });
}
}