Java では、少なくとも 2 つの方法でカスタム プロトコル ハンドラを登録できます。
- システムプロパティ「java.protocol.handler.pkgs」を設定することにより
- URL.setURLStreamHandlerFactory の使用
詳細については、http://accu.org/index.php/journals/1434を確認してください。
最初のオプションを使用することはできません。サーバー (Tomcat) クラスパスに多数の jar ファイルを追加して、ブートストラップ クラスローダーでハンドラーの実装を表示できるようにする必要があるからです。さらに、いくつかの初期化が必要であり、これはアプリケーション コンテキストで実行する必要があります。
2 番目のオプションの問題は、Factory を 1 回しか登録できないことです (java.net.URL#setURLStreamHandlerFactory を確認してください)。残念ながら、それは Tomcat によって行われます。
私にできることは、プロトコル ハンドラによって既存のデコレータ ファクトリを拡張するデコレータ ファクトリを作成することです。リフレクションを使用するよりも、静的フィールド URL#factory を null に設定し、URL#setURLStreamHandlerFactory を使用して標準的な方法で「decoratorFactory」を登録します (もう一度?)。ここでリフレクションを使用するのが良い考えかどうか疑問に思っています...? セキュリティはどうですか?
私はそのようなことをしたいと思います:
try {
Field factoryField = URL.class.getDeclaredField("factory");
factoryField.setAccessible(true);
// get current factory
Object currentFactory = factoryField.get(null);
// define a decorator factory
MyFactoryDecorator mfd = new MyFactoryDecorator(currentFactory);
// set the factory to null and register MyFactoryDecorator using URL#setURLStreamHandlerFactory.
factoryField.set(null, null);
URL.setURLStreamHandlerFactory(mfd);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}