最近、実行時にアプリケーションに jar ファイルを動的にロードする方法を探していました。
私は何度か特定の解決策に出くわしました。これは基本的に、システムクラスローダーを取得し、リフレクションを使用して、実行時に元のクラスパスに追加ファイルを追加するために、保護されていない addURL メソッドにアクセスする「ハック」です。このソリューションはおそらく非常にうまく機能し、自作のカスタム クラス ローダーを作成して使用するときに発生する問題を回避します。
次のようになります。
URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class sysclass = URLClassLoader.class;
try {
Method method = sysclass.getDeclaredMethod("addURL", parameters);
method.setAccessible(true);
method.invoke(sysloader, new Object[] { u });
} catch (Throwable t) {
t.printStackTrace();
throw new IOException("Error, could not add URL to system classloader");
}
私の質問は次のとおりです。最初にaddURLメソッドを保護するのには本当に正当な理由があると思います.クラスパスに動的にファイルを追加するとき、何らかの落とし穴や危険があるに違いありません.
システム クラスローダが常に URLClassLoader であると仮定する以外に、これは「常にそうあるべき」(TM) ですが、この「ハック」を使用するとどのような問題が発生する可能性がありますか?
ありがとう