署名付きアプレットから Java クラスをロードする
-
09-06-2019 - |
質問
署名付き Java アプレットを実行している場合、リモート ソース (同じドメイン、場合によっては同じホスト内) から追加のクラスをロードして実行できますか?
ページを変更したり、現在のアプレットを停止したりせずにこれを実行したいと考えています。もちろん、すべてのクラスの合計サイズは大きすぎて、すべてを一度にロードできません。
これを行う方法はありますか?そして、署名付きアプレットでこれを実行し、その「信頼」ステータスを維持する方法はあるのでしょうか?
解決
アプレットではクラスが遅延ロードされていると思います。オンデマンドでロードされます。
とにかく、クラスが jar の外部にある場合は、アプレット クラスローダーを使用して、名前でクラスをロードするだけです。元:
ClassLoader loader = this.getClass().getClassLoader();
Class clazz = loader.loadClass("acme.AppletAddon");
jar からクラスをロードしたい場合は、jar の URL を使用して URLClassLoader の新しいインスタンスを作成する必要があると思います。
URL[] urls = new URL[]{new URL("http://localhost:8080/addon.jar")};
URLClassLoader loader = URLClassLoader.newInstance(urls,this.getClass().getClassLoader());
Class clazz = loader.loadClass("acme.AppletAddon");
デフォルトでは、アプレットは新しいクラスローダーを作成することを禁止されています。ただし、アプレットに署名し、新しいクラスローダーを作成する権限を含めれば、それを行うことができます。
他のヒント
はい、アプレットを実行したホストへの URL 接続を開くことができます。HTTP URL を使用してクラスローダーを作成することも、クラスを (jar として) ユーザーのマシンにダウンロードして、クラスパス内にそれらの jar を含むクラスローダーを作成することもできます。アプレットは停止しないので、別のページをロードする必要はありません。
信頼性に関する質問の 2 番目の部分に関しては、ユーザーがアプレットへのアクセスを許可すると、ローカル マシンに必要なものを何でもダウンロードできます。UI デザインで許可されていれば、何をしているのかをユーザーに知らせることができるでしょう。
お役に立てれば。
それは可能であるはずのように聞こえます(しかし、私はやったことがありません)。リモート メソッド呼び出し (RMI)?