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
Атрибуты
Реализации

Комментарии

Объект для загрузки реализаций службы.

Служба — это известный интерфейс или класс, для которого существуют ноль, один или несколько поставщиков услуг. Поставщик услуг (или просто поставщик) — это класс, реализующий или подклассы хорошо известный интерфейс или класс. Это ServiceLoader объект, который находит и загружает поставщиков услуг, развернутых в среде выполнения во время выполнения во время выбора приложения. Код приложения относится только к службе, а не к поставщикам услуг, и предполагается, что он может выбирать между несколькими поставщиками услуг (на основе функциональных возможностей, предоставляемых через службу), и обрабатывать возможность того, что поставщики услуг не находятся.

<h2> Получение загрузчика <службы /h2>

Приложение получает загрузчик службы для данной службы путем вызова одного из статических loadServiceLoaderметодов. <--If приложение является модулем, то его объявление модуля должно иметь директиву using , указывающую службу; это помогает находить поставщиков и обеспечить надежную работу. Кроме того, если модуль приложения не содержит службу, то его объявление модуля должно иметь директиву,которая указывает модуль, экспортируемый службой. Настоятельно рекомендуется, чтобы модуль <приложения не> /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 службы, а затем использует его итератор (созданный автоматически с помощью расширенного цикла) для получения экземпляров поставщиков услуг, расположенных:

{@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;
                    }
            }

Иногда приложению может потребоваться проверить поставщика услуг, прежде чем создавать экземпляры, чтобы определить, будет ли полезно экземпляр этого поставщика услуг. Например, поставщик услуг для CodecFactory этого может создавать кодировщик PNG с аннотированием @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 A stream of < objects >/liProvider<CodecFactory><>< li дает /li li>p.type() возвращаетClass<CodecFactory>< экземпляр ></li>get()/olCodecFactory<><>

<h2> Проектирование служб </h2>

Служба — это один тип, обычно интерфейс или абстрактный класс. Конкретный класс можно использовать, но это не рекомендуется. Тип может иметь какие-либо специальные возможности. Методы службы являются очень конкретными для домена, поэтому эта спецификация API не может дать конкретные советы по их форме или функции. Однако существует два общих руководства: <ol><li>

Служба должна объявлять столько методов, сколько необходимо, чтобы поставщики услуг могли взаимодействовать со своими свойствами домена и другими факторами качества реализации. Приложение, которое получает загрузчик службы для службы, может вызвать эти методы для каждого экземпляра поставщика услуг, чтобы выбрать лучшего поставщика для приложения.

</li li><>

Служба должна выразить, должны ли ее поставщики услуг быть прямыми реализациями службы или быть косвенным механизмом, таким как "прокси" или "фабрика". Поставщики услуг, как правило, являются механизмами косвенного обращения, когда объекты, относящиеся к домену, являются относительно дорогостоящими для создания экземпляров; В этом случае служба должна быть разработана таким образом, чтобы поставщики услуг были абстракциями, которые создают "реальную" реализацию по запросу. Например, CodecFactory служба выражает свое имя, что ее поставщики услуг являются фабриками для кодеков, а не кодеков, так как это может быть дорогостоящим или сложным для создания определенных кодеков.

</li></ol>

<h2> "разработка-поставщики услуг">Разработка поставщиков< услуг/h2>

Поставщик услуг — это один тип, обычно конкретный класс. Интерфейс или абстрактный класс разрешен, так как он может объявить статический метод поставщика, рассмотренный далее. Тип должен быть общедоступным и не должен быть внутренним классом.

Поставщик услуг и его вспомогательный код могут быть разработаны в модуле, который затем развертывается на пути модуля приложения или в модульном образе. Кроме того, поставщик услуг и его вспомогательный код могут быть упаковированы в JAR-файл и развернуты на пути класса приложения. Преимущество разработки поставщика услуг в модуле заключается в том, что поставщик может быть полностью инкапсулирован для скрытия всех деталей его реализации.

Приложение, которое получает загрузчик службы для данной службы, равнодушно к тому, развертываются ли поставщики службы в модулях или упаковываются в виде JAR-файлов. Приложение создает экземпляры поставщиков услуг с помощью итератора загрузчика службы или через Provider Provider объекты в потоке загрузчика службы без знаний о расположениях поставщиков услуг.

<h2> Развертывание поставщиков услуг на пути к <классу /h2>

Поставщик услуг, упакованный в виде JAR-файла для пути класса, определяется путем размещения файла конфигурации поставщика в каталоге META-INF/servicesресурсов. Имя файла конфигурации поставщика — это полное двоичное имя службы. Файл конфигурации поставщика содержит список полных двоичных имен поставщиков услуг, по одной строке.

Например, предположим, что поставщик com.example.impl.StandardCodecs услуг упаковается в JAR-файл для пути к классу. JAR-файл будет содержать файл конфигурации поставщика:

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

содержит строку:

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

>Файл конфигурации поставщика должен быть закодирован в UTF-8. Пробелы и символы табуляции, окружающие имя каждого поставщика услуг, а также пустые строки, игнорируются. Символ комментария — '#' (U+0023<style="font-size:small;">NUMBER SIGN</span>); на каждой строке все символы после первого символа комментария игнорируются. Если имя класса поставщика услуг указано несколько раз в файле конфигурации поставщика, дубликаты игнорируются. Если класс поставщика услуг называется в нескольких файлах конфигурации, дубликаты игнорируются.

Поставщик услуг, упомянутый в файле конфигурации поставщика, может находиться в том же JAR-файле, что и файл конфигурации поставщика или другой JAR-файл. Поставщик услуг должен быть видимым из загрузчика класса, который изначально запрашивается, чтобы найти файл конфигурации поставщика; Это не обязательно загрузчик класса, который в конечном итоге находит файл конфигурации поставщика.

<h2> Время обнаружения <поставщика /h2>

Поставщики услуг загружаются и создаются безумно, то есть по требованию. Загрузчик службы поддерживает кэш поставщиков, которые были загружены до сих пор. Каждый вызов iterator метода возвращает Iterator значение, которое сначала возвращает все элементы, кэшированные из предыдущей итерации, в порядке экземпляра, а затем лениво находит и создает экземпляры всех оставшихся поставщиков, добавляя каждый из них в кэш в свою очередь. Аналогичным образом каждый вызов метода потока возвращает Stream значение, которое сначала обрабатывает всех поставщиков, загруженных предыдущими операциями потока, в порядке загрузки, а затем лениво находит всех оставшихся поставщиков. Кэши очищаются с помощью #reload reload метода.

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

При использовании загрузчика iteratorIterator#hasNext() hasNextIterator#next() next службы методы завершаются ошибкой ServiceConfigurationError при обнаружении, загрузке или создании экземпляра поставщика услуг. При обработке потока ServiceConfigurationError загрузчика службы может вызываться любым методом, который приводит к расположению или загрузке поставщика услуг.

При загрузке или создании экземпляра поставщика услуг в модуле ServiceConfigurationError можно создать по следующим причинам:

При чтении файла конфигурации поставщика или загрузке или создании экземпляра класса поставщика с именем в файле ServiceConfigurationError конфигурации поставщика можно создать по следующим причинам:

<Ул>

<li> Формат файла конфигурации поставщика нарушает указанный выше формат; </li>

<li> Возникает IOException IOException при чтении файла конфигурации поставщика; </li>

<li> Поставщик услуг не может быть загружен; </li>

<li> Поставщик услуг не может назначаться интерфейсу или классу службы или не определяет конструктор поставщика или не может быть создан экземпляр. </li>

</ul>

<h2> Concurrency </h2>

Экземпляры этого класса небезопасны для использования несколькими параллельными потоками.

<Обработка >h3 NULL /h3<>

Если иное не указано, передача аргумента null любому методу в этом классе приведет NullPointerException к возникновению ошибки.

Добавлено в версии 1.6.

Java документации по java.util.ServiceLoader.

Части этой страницы — это изменения на основе работы, созданной и общей Project и используемых в соответствии с условиями, описанными в разделе "".

Свойства

Имя Описание
Class

Возвращает класс среды выполнения этого Objectобъекта.

(Унаследовано от Object)
Handle

Дескриптор базового экземпляра Android.

(Унаследовано от Object)
JniIdentityHashCode

Возвращает хэш-код удостоверения, назначенный этому Java одноранговой среде выполнения взаимодействия.

(Унаследовано от Object)
JniManagedPeerState

Объект для загрузки реализаций службы.

(Унаследовано от JavaObject)
JniPeerMembers

Объект для загрузки реализаций службы.

PeerReference

Возвращает ссылку на объект JNI для этого Java однорангового узла.

(Унаследовано от Object)
ThresholdClass

Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода.

(Унаследовано от Object)
ThresholdType

Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода.

(Унаследовано от 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()

Lazily загружает доступных поставщиков службы этого загрузчика.

JavaFinalize()

Вызывается сборщиком мусора в объекте, когда сборка мусора определяет, что больше ссылок на объект нет.

(Унаследовано от Object)
Load(Class, ClassLoader)

Создает новый загрузчик службы для заданного типа службы и загрузчика класса.

Load(Class)

Создает новый загрузчик службы для заданного типа службы с помощью java текущего потока.

LoadInstalled(Class)

Создает новый загрузчик службы для заданного типа службы с помощью загрузчика класса расширения.

Notify()

Просыпается один поток, ожидающий монитора этого объекта.

(Унаследовано от Object)
NotifyAll()

Просыпает все потоки, ожидающие монитора этого объекта.

(Унаследовано от Object)
Reload()

Снимите кэш поставщика загрузчика, чтобы все поставщики были перезагружены.

SetHandle(IntPtr, JniHandleOwnership)

Задает свойство Handle.

(Унаследовано от Object)
SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

Объект для загрузки реализаций службы.

(Унаследовано от JavaObject)
ToArray<T>()

Создает управляемый массив из этого Java оболочки массива.

(Унаследовано от Object)
ToString()

Возвращает строковое представление объекта.

(Унаследовано от Object)
UnregisterFromRuntime()

Отменяет регистрацию этого Java однорангового узла из среды выполнения взаимодействия.

(Унаследовано от Object)
Wait()

Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, путем <><уведомления/>em или <эм>прерванного</em.>

(Унаследовано от Object)
Wait(Int64, Int32)

Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>получении уведомления</>em или <>эм прерваны< или> до тех пор, пока не истекло определенное количество реального времени.

(Унаследовано от Object)
Wait(Int64)

Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>получении уведомления</>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)

Возвращает имя JNI типа экземпляра self.

JavaAs<TResult>(IJavaPeerable)

Попробуйте принуждать к типуself, проверяяTResult, является ли приведение допустимым на стороне Java.

JavaCast<TResult>(IJavaObject)

Выполняет преобразование типа, проверяемого средой выполнения Android.

JavaCast<TResult>(IJavaObject)

Объект для загрузки реализаций службы.

ToEnumerable(IIterable)

Объект для загрузки реализаций службы.

ToEnumerable<T>(IIterable)

Объект для загрузки реализаций службы.

TryJavaCast<TResult>(IJavaPeerable, TResult)

Попробуйте принуждать к типуself, проверяяTResult, является ли приведение допустимым на стороне Java.

Применяется к