6

最近、実行時にアプリケーションに 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) ですが、この「ハック」を使用するとどのような問題が発生する可能性がありますか?

ありがとう

4

1 に答える 1

1

主な危険は、メソッドの存在の実行時チェックに依存することです。

メソッドのシグネチャが将来変更された場合、実行時までわかりません。代替方法が提供されていない場合、これは厄介な状況に陥る可能性もあります。

また、すでに述べたように、デザイナーprotectedは何らかの理由でその方法を選択します (それ以外は、事前の考慮の欠如)。

于 2012-10-27T19:35:02.147 に答える