言語

ServiceLoader クラス

定義

サービスの実装を読み込む機能。

[Android.Runtime.Register("java/util/ServiceLoader", DoNotGenerateAcw=true)]
[Java.Interop.JavaTypeParameters(new System.String[] { "S" })]
public sealed class ServiceLoader : Java.Lang.Object, IDisposable, Java.Lang.IIterable
[<Android.Runtime.Register("java/util/ServiceLoader", DoNotGenerateAcw=true)>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "S" })>]
type ServiceLoader = class
    inherit Object
    interface IIterable
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
継承
ServiceLoader
属性
実装

注釈

サービスの実装を読み込む機能。

サービスは、ゼロ、1、または多くのサービス プロバイダーが存在する既知のインターフェイスまたはクラスです。 サービス プロバイダー (またはプロバイダーのみ) は、既知のインターフェイスまたはクラスを実装またはサブクラス化するクラスです。 ServiceLoaderは、アプリケーションが選択した時点で実行時環境にデプロイされたサービス プロバイダーを見つけて読み込むオブジェクトです。 アプリケーション コードはサービス プロバイダーではなくサービスのみを指し、(サービスを通じて公開される機能に基づいて) 複数のサービス プロバイダーを選択し、サービス プロバイダーが存在しない可能性を処理できると見なされます。

<h2> サービス ローダー </h2 の取得>

アプリケーションは、loadの静的ServiceLoaderメソッドのいずれかを呼び出して、特定のサービスのサービス ローダーを取得します。 <--アプリケーションがモジュールの場合、そのモジュール宣言にはサービスを指定する uses ディレクティブが必要です。これにより、プロバイダーを特定し、確実に実行できるようになります。 さらに、アプリケーション モジュールにサービスが含まれていない場合、そのモジュール宣言には、サービスをエクスポートするモジュールを指定する requires ディレクティブが必要です。 アプリケーション モジュールでは、サービスのプロバイダーを含むモジュールが必要<b></b>しないことを強くお勧めします。--/>

サービス ローダーを使用して、 #iterator() iterator メソッドを使用してサービスのプロバイダーを見つけてインスタンス化できます。 ServiceLoader では、インスタンス化せずに検査およびフィルター処理できるプロバイダーのストリームを取得する #stream() stream メソッドも定義されています。

たとえば、サービスが com.example.CodecFactoryであり、エンコーダーとデコーダーを生成するためのメソッドを定義するインターフェイスであるとします。

{@code
                package com.example;
                public interface CodecFactory {
                    Encoder getEncoder(String encodingName);
                    Decoder getDecoder(String encodingName);
                }
            }

次のコードは、 CodecFactory サービスのサービス ローダーを取得し、その反復子 (enhanced-for ループによって自動的に作成) を使用して、配置されているサービス プロバイダーのインスタンスを生成します。

{@code
                ServiceLoader<CodecFactory> loader = ServiceLoader.load(CodecFactory.class);
                for (CodecFactory factory : loader) {
                    Encoder enc = factory.getEncoder("PNG");
                    if (enc != null)
                        ... use enc to encode a PNG file
                        break;
                    }
            }

アプリケーションでは、インスタンス化する前にサービス プロバイダーを検査して、そのサービス プロバイダーのインスタンスが役に立つかどうかを判断したい場合があります。 たとえば、"PNG" エンコーダーを生成できる CodecFactory のサービス プロバイダーには、 @PNGで注釈を付けることができます。 次のコードでは、サービス ローダーのstream メソッドを使用して、反復子がProvider<CodecFactory>のインスタンスを生成する方法とは対照的に、CodecFactoryのインスタンスを生成します。

{@code
                ServiceLoader<CodecFactory> loader = ServiceLoader.load(CodecFactory.class);
                Set<CodecFactory> pngFactories = loader
                       .stream()                                              // Note a below
                       .filter(p -> p.type().isAnnotationPresent(PNG.class))  // Note b
                       .map(Provider::get)                                    // Note c
                       .collect(Collectors.toSet());
            }

<ol type="a"><li>Provider<CodecFactory> オブジェクトのストリーム </li><li>p.type() は、 Class<CodecFactory></li><li>get() が生成され、 CodecFactory</li></ol のインスタンスが生成されます。>

<h2> サービス </h2 の設計>

サービスは 1 つの型であり、通常はインターフェイスまたは抽象クラスです。 具象クラスは使用できますが、これはお勧めしません。 型には任意のアクセシビリティがある場合があります。 サービスのメソッドはドメイン固有の方法であるため、この API 仕様では、その形式や機能に関する具体的なアドバイスを提供できません。 ただし、 <ol><li という 2 つの一般的なガイドラインがあります。>

サービス プロバイダーがドメイン固有のプロパティやその他の実装の品質要因を伝達できるようにするために、サービスは必要な数のメソッドを宣言する必要があります。 サービスのサービス ローダーを取得するアプリケーションは、アプリケーションに最適なプロバイダーを選択するために、サービス プロバイダーの各インスタンスでこれらのメソッドを呼び出すことができます。

</li><li>

サービス プロバイダーがサービスの直接実装を目的としているか、"プロキシ" や "ファクトリ" などの間接メカニズムであるかを表す必要があります。 ドメイン固有のオブジェクトのインスタンス化に比較的コストがかかる場合、サービス プロバイダーは間接参照メカニズムになる傾向があります。この場合、サービス プロバイダーが必要に応じて "実際の" 実装を作成する抽象化になるように、サービスを設計する必要があります。 たとえば、 CodecFactory サービスは、サービス プロバイダーがコーデック自体ではなくコーデックのファクトリであることをその名前で表しています。これは、特定のコーデックを生成するためにコストがかかるか複雑になる可能性があるためです。

</li></ol>

<h2> "developing-service-providers">Developing サービス プロバイダー</h2>

サービス プロバイダーは 1 つの型であり、通常は具象クラスです。 インターフェイスまたは抽象クラスは、後で説明する静的プロバイダー メソッドを宣言できるため、許可されます。 型はパブリックである必要があり、内部クラスである必要はありません。

サービス プロバイダーとそのサポート コードは、モジュールで開発できます。モジュールは、アプリケーション モジュール パスまたはモジュール イメージにデプロイされます。 または、サービス プロバイダーとそのサポート コードを JAR ファイルとしてパッケージ化し、アプリケーション クラス パスにデプロイすることもできます。 モジュールでサービス プロバイダーを開発する利点は、プロバイダーを完全にカプセル化して、実装のすべての詳細を非表示にできることです。

特定のサービスのサービス ローダーを取得するアプリケーションは、サービスのプロバイダーがモジュールにデプロイされているか、JAR ファイルとしてパッケージ化されているかに関して無関心です。 アプリケーションは、サービス ローダーの反復子を介して、またはサービス ローダーのストリーム内の Provider Provider オブジェクトを介して、サービス プロバイダーの場所を知らなくてもサービス プロバイダーをインスタンス化します。

<h2> クラス パス </h2 にサービス プロバイダーをデプロイする>

クラス パスの JAR ファイルとしてパッケージ化されたサービス プロバイダーは、リソース ディレクトリ META-INF/servicesを配置することによって識別されます。 プロバイダー構成ファイルの名前は、サービスの完全修飾バイナリ名です。 プロバイダー構成ファイルには、1 行に 1 つずつ、サービス プロバイダーの完全修飾バイナリ名の一覧が含まれています。

たとえば、サービス プロバイダー com.example.impl.StandardCodecs がクラス パスの JAR ファイルにパッケージ化されるとします。 JAR ファイルには、次の名前のプロバイダー構成ファイルが含まれます。

<blockquote>META-INF/services/com.example.CodecFactory</blockquote>

行を含む次の値を指定します。

<blockquote>com.example.impl.StandardCodecs # Standard codecs</blockquote>

"format">プロバイダー構成ファイルは UTF-8 でエンコードする必要があります。 各サービス プロバイダーの名前を囲む空白文字とタブ文字は無視されます。 コメント文字が '#' (U+0023<span style="font-size:smaller;">NUMBER SIGN</span>); は、各行で最初のコメント文字の後にあるすべての文字は無視されます。 プロバイダー構成ファイルにサービス プロバイダー クラス名が複数回表示されている場合、重複は無視されます。 サービス プロバイダー クラスに複数の構成ファイルの名前が付けられている場合、重複は無視されます。

プロバイダー構成ファイルに記載されているサービス プロバイダーは、プロバイダー構成ファイルと同じ JAR ファイルまたは別の JAR ファイルに配置できます。 サービス プロバイダーは、プロバイダー構成ファイルを検索するために最初に照会されたクラス ローダーから表示される必要があります。これは、最終的にプロバイダー構成ファイルを検索するクラス ローダーであるとは限りません。

<h2> プロバイダー検出 </h2 のタイミング>

サービス プロバイダーは、必要に応じて遅延で読み込まれ、インスタンス化されます。 サービス ローダーは、これまでに読み込まれたプロバイダーのキャッシュを保持します。 iterator メソッドの各呼び出しは、最初にインスタンス化順序で前のイテレーションからキャッシュされたすべての要素を生成し、残りのプロバイダーを遅延的に検索してインスタンス化するIteratorを返し、それぞれをキャッシュに追加します。 同様に、ストリーム メソッドの各呼び出しでは、最初に以前のストリーム操作によって読み込まれたすべてのプロバイダーを読み込み順序で処理し、残りのプロバイダーを遅延して検索する Stream が返されます。 キャッシュは、 #reload reload メソッドを使用してクリアされます。

<h2> "errors">Errors</h2>

サービス ローダーの iteratorを使用すると、サービス プロバイダーの検索、読み込み、インスタンス化でエラーが発生した場合、 Iterator#hasNext() hasNext メソッドと Iterator#next() next メソッドは ServiceConfigurationError で失敗します。 サービス ローダーのストリームを処理するときに、サービス プロバイダーを見つけたり読み込んだりするメソッドによって、 ServiceConfigurationError がスローされる可能性があります。

モジュールでサービス プロバイダーを読み込んだりインスタンス化したりする場合、 ServiceConfigurationError は次の理由でスローされる可能性があります。

プロバイダー構成ファイルの読み取り、またはプロバイダー構成ファイルで名前付きのプロバイダー クラスの読み込みまたはインスタンス化を行う場合、 ServiceConfigurationError は次の理由でスローされる可能性があります。

<ul>

<li> プロバイダー構成ファイルの形式が、上記で指定した形式に違反しています。 </li>

<li> プロバイダー構成ファイルの読み取り中に IOException IOException が発生します。 </li>

<li> サービス プロバイダーを読み込めません。 </li>

<li> サービス プロバイダーは、サービスのインターフェイスまたはクラスに割り当てることができないか、プロバイダー コンストラクターを定義していないか、インスタンス化できません。 </li>

</ul>

<h2> コンカレンシー </h2>

このクラスのインスタンスは、複数の同時実行スレッドで使用しても安全ではありません。

<h3> null 処理 </h3>

特に指定しない限り、このクラスのメソッドに null 引数を渡すと、 NullPointerException がスローされます。

1.6 で追加されました。

Javaドキュメント。

このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。

プロパティ

名前 説明
Class

この Objectのランタイム クラスを返します。

(継承元 Object)
Handle

基になる Android インスタンスへのハンドル。

(継承元 Object)
JniIdentityHashCode

相互運用ランタイムによってこのJava ピアに割り当てられた ID ハッシュ コードを取得します。

(継承元 Object)
JniManagedPeerState

サービスの実装を読み込む機能。

(継承元 JavaObject)
JniPeerMembers

サービスの実装を読み込む機能。

PeerReference

このJava ピアの JNI オブジェクト参照を取得します。

(継承元 Object)
ThresholdClass

この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。

(継承元 Object)
ThresholdType

この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。

(継承元 Object)

メソッド

名前 説明
Clone()

このオブジェクトのコピーを作成して返します。

(継承元 Object)
Construct(JniObjectReference, JniObjectReferenceOptions)

サービスの実装を読み込む機能。

(継承元 JavaObject)
Dispose()

このJava ピアによって保持されているリソースを解放します。

(継承元 Object)
Dispose(Boolean)

このJava ピアによって保持されているリソースを解放します。

(継承元 Object)
DisposeUnlessReferenced()

サービスの実装を読み込む機能。

(継承元 JavaObject)
Equals(Object)

サービスの実装を読み込む機能。

(継承元 JavaObject)
Equals(Object)

他のオブジェクトがこのオブジェクトと "等しい" かどうかを示します。

(継承元 Object)
FindFirst()

このローダーのサービスの最初の使用可能なサービス プロバイダーを読み込みます。

GetHashCode()

オブジェクトのハッシュ コード値を返します。

(継承元 Object)
Iterator()

このローダーのサービスの使用可能なプロバイダーを遅延読み込みます。

JavaFinalize()
古い.

オブジェクトへの参照がなくなったとガベージ コレクションによって判断されたときに、オブジェクトのガベージ コレクターによって呼び出されます。

(継承元 Object)
Load(Class, ClassLoader)

指定されたサービスの種類とクラス ローダーの新しいサービス ローダーを作成します。

Load(Class)

現在のスレッドの java を使用して、特定のサービスの種類の新しいサービス ローダーを作成します。

LoadInstalled(Class)

拡張クラス ローダーを使用して、特定のサービスの種類の新しいサービス ローダーを作成します。

Notify()

このオブジェクトのモニターで待機している 1 つのスレッドを起動します。

(継承元 Object)
NotifyAll()

このオブジェクトのモニターで待機しているすべてのスレッドを起動します。

(継承元 Object)
Reload()

すべてのプロバイダーが再読み込みされるように、このローダーのプロバイダー キャッシュをクリアします。

SetHandle(IntPtr, JniHandleOwnership)

Handle プロパティを設定します。

(継承元 Object)
SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

サービスの実装を読み込む機能。

(継承元 JavaObject)
ToArray<T>()

このJava配列ラッパーからマネージド配列を作成します。

(継承元 Object)
ToString()

オブジェクトの文字列形式を返します。

(継承元 Object)
UnregisterFromRuntime()

相互運用ランタイムからこのJava ピアの登録を解除します。

(継承元 Object)
Wait()

現在のスレッドが起動するまで待機します。通常は、 <em>notified</em> または <em>interrupted</em>。

(継承元 Object)
Wait(Int64, Int32)

現在のスレッドは、通常、 <em>notified</em> または <em>interrupted</em>、または一定のリアルタイムが経過するまで、起動されるまで待機します。

(継承元 Object)
Wait(Int64)

現在のスレッドは、通常、 <em>notified</em> または <em>interrupted</em>、または一定のリアルタイムが経過するまで、起動されるまで待機します。

(継承元 Object)

明示的なインターフェイスの実装

名前 説明
IJavaPeerable.Disposed()

サービスの実装を読み込む機能。

(継承元 JavaObject)
IJavaPeerable.Finalized()

サービスの実装を読み込む機能。

(継承元 JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

サービスの実装を読み込む機能。

(継承元 JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

サービスの実装を読み込む機能。

(継承元 JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

サービスの実装を読み込む機能。

(継承元 JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

サービスの実装を読み込む機能。

(継承元 JavaObject)
IJavaPeerable.UnregisterFromRuntime()

サービスの実装を読み込む機能。

拡張メソッド

名前 説明
GetJniTypeName(IJavaPeerable)

インスタンス selfの型の JNI 名を取得します。

JavaAs<TResult>(IJavaPeerable)

selfを強制的にTResult入力し、強制型がJava側で有効であることを確認します。

JavaCast<TResult>(IJavaObject)

Android ランタイムチェック型変換を実行します。

JavaCast<TResult>(IJavaObject)

サービスの実装を読み込む機能。

ToEnumerable(IIterable)

Java IIterableを反復処理するIEnumerableを返します。これにより、foreachと LINQ をJavaコレクション型で使用できます。 各要素は、Java インスタンスから対応するマネージド型にマーシャリングされます。

ToEnumerable<T>(IIterable)

Java IIterableを反復処理し、各要素をTにマーシャリングするIEnumerable<T>を返します。 これにより、foreachと LINQ をJavaコレクション型で使用できます。

TryJavaCast<TResult>(IJavaPeerable, TResult)

selfを強制的にTResult入力し、強制型がJava側で有効であることを確認します。

適用対象