Java の URL サポートをカスタマイズしてクラスパスからリソースを直接ロードするにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-23 05:50:38
オリジナル
237 人が閲覧しました

How Can I Customize Java's URL Support to Load Resources Directly from the Classpath?

クラスパス リソース読み込みのための Java の URL サポートのカスタマイズ

Java では、開発者はさまざまな URL プロトコルを利用した汎用性の高いリソース読み込み API にアクセスできます。ただし、「file://」や「http://」などのプロトコルは特定の場所からのリソースの取得を容易にしますが、jar またはクラス フォルダーを明示的に指定せずにアプリケーションのクラスパスからリソースにアクセスする必要がある場合があります。この記事では、クラスパスベースのリソース読み込みのためのカスタム URL プロトコルとストリーム ハンドラーを導入して、この要件の解決策を検討します。

カスタム ストリーム ハンドラーの実装

ソリューションの中心となるのは、次の URLStreamHandler です。指定された URL への接続。このハンドラーは、サポートされるプロトコルとして「シンプル」パッケージ名を使用して URL クラスに登録する必要があります。

package org.my.protocols.classpath;

import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;

public class Handler extends URLStreamHandler {
    private final ClassLoader classLoader;

    public Handler() {
        this.classLoader = getClass().getClassLoader();
    }

    @Override
    protected URLConnection openConnection(URL u) /*throws IOException*/ {
        final URL resourceUrl = classLoader.getResource(u.getPath());
        return resourceUrl.openConnection();
    }
}
ログイン後にコピー

カスタム プロトコルの使用

カスタム プロトコルを使用してリソースをロードするには、次の構文:

new URL("classpath:org/my/package/resource.extension").openConnection();
ログイン後にコピー

クラスパスに対する相対パスを指定することで、リソースを特定の指定をせずにロードできるようになります。

拡張処理

クラスパスからロードされたリソースを適切に処理するには、起動構成と JVM レベルのハンドラー登録に関する問題を解決する必要がある場合があります。

手動ハンドラー指定

自動ハンドラー登録の代わりに、URL 中にハンドラーを手動で指定することができます。作成:

new URL(
    null, 
    "classpath:some/package/resource.extension", 
    new org.my.protocols.classpath.Handler(ClassLoader.getSystemClassLoader())
);
ログイン後にコピー

JVM レベルのハンドラーの登録

アプリケーション全体のクラスパス リソースの読み込みでは、URLStreamHandlerFactory を JVM に登録することをお勧めします。これにより、カスタム ハンドラーをすべての URL で使用できるようになります。

package my.org.url;

import java.net.URLStreamHandler;
import java.net.URLStreamHandlerFactory;
import java.util.HashMap;
import java.util.Map;

class ConfigurableStreamHandlerFactory implements URLStreamHandlerFactory {
    private final Map<String, URLStreamHandler> protocolHandlers;

    public ConfigurableStreamHandlerFactory(String protocol, URLStreamHandler urlHandler) {
        protocolHandlers = new HashMap<>();
        addHandler(protocol, urlHandler);
    }

    public void addHandler(String protocol, URLStreamHandler urlHandler) {
        protocolHandlers.put(protocol, urlHandler);
    }

    public URLStreamHandler createURLStreamHandler(String protocol) {
        return protocolHandlers.get(protocol);
    }
}
ログイン後にコピー

ファクトリを登録するには、URL.setURLStreamHandlerFactory() を呼び出し、構成されたファクトリを渡します。

結論

カスタム URLStreamHandler およびストリーム ハンドラー ファクトリを作成することにより、Java のリソース読み込み機能を拡張して、アプリケーション上にあるリソースを含めることができます。クラスパス。これにより、柔軟性が向上し、さまざまなソースからリソースをロードするプロセスが簡素化されます。

以上がJava の URL サポートをカスタマイズしてクラスパスからリソースを直接ロードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート