思い出して持ってくる

cron に似たものを作る際に必要なものがある。
スケジュールしたい処理に必要なCLASSPATHXMLに書くことになるので、途中から、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 });
   }
}