クラスパス ファイルを動的に変更する
このクエリの前提は、実行時に Java クラスパス内のファイルを変更する機能を中心に展開します。完全に新しいファイルを追加することはできませんが、この質問では、クラスパスにすでに存在するファイルを変更されたバージョンで更新できるかどうかを尋ねます。
問題への対処
Java のクラス ローダー メカニズムでは、クラスパスへのフォルダーまたは JAR ファイルの追加のみが許可されます。したがって、スタンドアロンのクラス ファイルがある場合は、まずそれを適切なフォルダー構造内に配置する必要があります。
この制限に対応して、実行時に SystemClassLoader を変更できるようにするかなり複雑なハックが考案されました。このアプローチでは、リフレクションを利用して保護された 'addURL' メソッドにアクセスし、システム クラスパスに新しい URL を含めることができます。
コード スニペット
次の Java コードは、このアプローチの実装:
<code class="java">import java.io.IOException; import java.io.File; import java.net.URLClassLoader; import java.net.URL; import java.lang.reflect.Method; public class ClassPathHacker { private static final Class[] parameters = new Class[]{URL.class}; public static void addFile(String s) throws IOException { File f = new File(s); addFile(f); }//end method public static void addFile(File f) throws IOException { addURL(f.toURL()); }//end method public static void addURL(URL u) throws IOException { 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"); }//end try catch }//end method }//end class</code>
重要な考慮事項
このメソッドはリフレクションを利用して保護されたメソッドにアクセスすることに注意することが重要です。そのため、セキュリティ管理者の存在下では失敗する可能性があります。
以上が実行時にクラスパス ファイルを動的に変更できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。