Spec-Zone.ru › OpenJDK 21

Класс RMIClassLoader

java.lang.Object
java.rmi.server.RMIClassLoader
public class RMIClassLoader extends Object
RMIClassLoader включает статические методы для поддержки динамической загрузки классов с использованием RMI. Включает методы для загрузки классов из сетевого местоположения (одного или нескольких URL) и получения местоположения, из которого существующий класс должен быть загружен удалёнными сторонами. Эти методы используются RMI-средой при сериализации и десериализации классов, содержащихся в аргументах и возвращаемых значениях вызовов удалённых методов, а также могут вызываться напрямую приложениями для имитации поведения динамической загрузки классов RMI.

Реализация следующих статических методов

  • loadClass(URL,String)
  • loadClass(String,String)
  • loadClass(String,String,ClassLoader)
  • loadProxyClass(String,String[],ClassLoader)
  • getClassLoader(String)
  • getClassAnnotation(Class)
предоставляется экземпляром RMIClassLoaderSpi, интерфейса поставщика сервисов для этих методов. При вызове одного из методов, его поведение заключается в делегировании соответствующему методу экземпляра поставщика. Подробности о том, как каждый метод делегирует экземпляру поставщика, описаны в документации для каждого конкретного метода.

Экземпляр поставщика выбирается следующим образом:

  • Если свойство системы java.rmi.server.RMIClassLoaderSpi определено, а его значение равно строке "default", то экземпляр поставщика будет значением, возвращаемым вызовом метода getDefaultProviderInstance(), а для любого другого значения, если класс с именем, равным значению свойства, может быть загружен системным загрузчиком классов (см. ClassLoader.getSystemClassLoader()), и этот класс присваивается RMIClassLoaderSpi и имеет публичный конструктор без аргументов, то этот конструктор будет вызван для создания экземпляра поставщика. Если свойство определено, но любое из этих условий не выполняется, то будет брошено неопределённое Error коду, пытающемуся использовать RMIClassLoader, указывая на неудачу получения экземпляра поставщика.
  • Если ресурс с именем META-INF/services/java.rmi.server.RMIClassLoaderSpi виден системному загрузчику классов, то содержимое этого ресурса интерпретируется как файл конфигурации поставщика, и первое имя класса, указанное в этом файле, используется как имя класса поставщика. Если класс с этим именем может быть загружен системным загрузчиком классов, этот класс присваивается RMIClassLoaderSpi и имеет публичный конструктор без аргументов, то этот конструктор будет вызван для создания экземпляра поставщика. Если ресурс найден, но поставщик не может быть инициализирован как описано, то будет брошено неопределённое Error коду, пытающемуся использовать RMIClassLoader, указывая на неудачу получения экземпляра поставщика.
  • В противном случае, экземпляр поставщика будет значением, возвращаемым вызовом метода getDefaultProviderInstance().
Since:
1.1
See Also:
  • RMIClassLoaderSpi

Краткое описание методов

Модификатор и тип Метод Описание
static String getClassAnnotation(Class<?> cl)
Возвращает строку аннотации (представляющую местоположение определения класса), которую RMI будет использовать для аннотации описателя класса при сериализации объектов данного класса.
static ClassLoader getClassLoader(String codebase)
Возвращает загрузчик классов, загружающий классы из заданного пути URL кодовой базы.
static RMIClassLoaderSpi getDefaultProviderInstance()
Возвращает канонический экземпляр стандартного поставщика для интерфейса поставщика сервисов RMIClassLoaderSpi.
static Object getSecurityContext(ClassLoader loader)
Устарело.
без замены.
static Class<?> loadClass(String name)
Устарело.
заменено методом loadClass(String,String)
static Class<?> loadClass(String codebase, String name)
Загружает класс из пути URL кодовой базы.
static Class<?> loadClass(String codebase, String name, ClassLoader defaultLoader)
Загружает класс из пути URL кодовой базы, при необходимости используя предоставленный загрузчик.
static Class<?> loadClass(URL codebase, String name)
Загружает класс из URL кодовой базы.
static Class<?> loadProxyClass(String codebase, String[] interfaces, ClassLoader defaultLoader)
Загружает динамический класс прокси (см. Proxy), реализующий набор интерфейсов с заданными именами из пути URL кодовой базы.

Методы, унаследованные от класса java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Подробное описание методов

loadClass

@Deprecated public static Class<?> loadClass(String name) throws MalformedURLException, ClassNotFoundException
Устаревший.
заменён методом loadClass(String,String)
Загружает класс с указанным name.

Этот метод делегирует вызов методу loadClass(String,String), передавая null в качестве первого аргумента и name в качестве второго.

Параметры:
name - имя класса для загрузки
Возвращает:
объект Class представляющий загруженный класс
Исключения:
MalformedURLException - если URL, специфичный для поставщика, используемый для загрузки классов, некорректен
ClassNotFoundException - если определение класса не найдено в указанном кодовом хранилище
См. также:
  • loadClass(String,String)

loadClass

public static Class<?> loadClass(URL codebase, String name) throws MalformedURLException, ClassNotFoundException
Загружает класс из URL кодовой базы. Если codebase равно null, то этот метод будет вести себя так же, как метод loadClass(String,String) с null codebase и заданным именем класса.

Этот метод делегирует вызов методу RMIClassLoaderSpi.loadClass(String,String,ClassLoader) экземпляра поставщика, передавая результат вызова URL.toString() для заданного URL (или null если codebase равно null) в качестве первого аргумента, name в качестве второго аргумента и null в качестве третьего.

Параметры:
codebase - URL для загрузки класса или null
name - имя класса для загрузки
Возвращает:
объект Class представляющий загруженный класс
Исключения:
MalformedURLException - если codebase равно null и URL, специфичный для поставщика, используемый для загрузки классов, некорректен
ClassNotFoundException - если определение класса не найдено по указанному URL

loadClass

public static Class<?> loadClass(String codebase, String name) throws MalformedURLException, ClassNotFoundException
Загружает класс из кодовой базы по пути URL.

Этот метод делегирует вызов методу RMIClassLoaderSpi.loadClass(String,String,ClassLoader) экземпляра поставщика, передавая codebase в качестве первого аргумента, name в качестве второго аргумента и null в качестве третьего.

Параметры:
codebase - список URL (разделенные пробелами) для загрузки класса, или null
name - имя класса для загрузки
Возвращает:
объект Class представляющий загруженный класс
Исключения:
MalformedURLException - если codebase не пустое и содержит некорректный URL, или если codebase равно null и URL, специфичный для поставщика, используемый для загрузки классов, некорректен
ClassNotFoundException - если определение класса не найдено по указанному пути
С:
1.2

loadClass

public static Class<?> loadClass(String codebase, String name, ClassLoader defaultLoader) throws MalformedURLException, ClassNotFoundException
Загружает класс из кодовой базы по пути URL, необязательно используя предоставленный загрузчик. Этот метод следует использовать, когда вызывающая сторона хочет предоставить реализации поставщика дополнительный контекстный загрузчик классов для рассмотрения, такой как загрузчик вызывающей стороны в стеке вызовов. Как правило, реализация поставщика попытается разрешить указанный класс, используя предоставленный defaultLoader, если он указан, прежде чем попытаться разрешить класс по пути URL кодовой базы.

Этот метод делегирует вызов методу RMIClassLoaderSpi.loadClass(String,String,ClassLoader) экземпляра поставщика, передавая codebase в качестве первого аргумента, name в качестве второго аргумента и defaultLoader в качестве третьего.

Параметры:
codebase - список URL (разделенные пробелами) для загрузки класса, или null
name - имя класса для загрузки
defaultLoader - дополнительный контекстный загрузчик классов для использования, или null
Возвращает:
объект Class представляющий загруженный класс
Исключения:
MalformedURLException - если codebase не пустое и содержит некорректный URL, или если codebase равно null и URL, специфичный для поставщика, используемый для загрузки классов, некорректен
ClassNotFoundException - если определение класса не найдено по указанному пути
С:
1.4

loadProxyClass

public static Class<?> loadProxyClass(String codebase, String[] interfaces, ClassLoader defaultLoader) throws ClassNotFoundException, MalformedURLException
Загружает динамический класс прокси (см. Proxy), реализующий набор интерфейсов с заданными именами из кодовой базы по пути URL.

Интерфейсы будут разрешены аналогично классам, загружаемым с помощью метода loadClass(String,String) с использованием заданных codebase.

Этот метод делегирует вызов методу RMIClassLoaderSpi.loadProxyClass(String,String[],ClassLoader) экземпляра поставщика, передавая codebase в качестве первого аргумента, interfaces в качестве второго аргумента и defaultLoader в качестве третьего.

Параметры:
codebase - список URL (разделенных пробелами) для загрузки классов, или null
interfaces - имена интерфейсов для реализации классом прокси
defaultLoader - дополнительный контекстный загрузчик классов для использования, или null
Возвращает:
динамический класс прокси, реализующий указанные интерфейсы
Исключения:
MalformedURLException - если codebase не пустое и содержит некорректный URL, или если codebase равно null и URL, специфичный для поставщика, используемый для загрузки классов, некорректен
ClassNotFoundException - если определение одного из указанных интерфейсов не найдено по указанному пути, или если создание динамического класса прокси не удалось (например, если Proxy.getProxyClass(ClassLoader,Class[]) бросит исключение IllegalArgumentException для данного списка интерфейсов)
С:
1.4

getClassLoader

public static ClassLoader getClassLoader(String codebase) throws MalformedURLException, SecurityException
Возвращает загрузчик классов, который загружает классы из указанного пути URL кодовой базы.

Возвращаемый загрузчик классов — это загрузчик классов, который метод loadClass(String,String) использовал бы для загрузки классов для того же аргумента codebase.

Этот метод делегирует вызов методу RMIClassLoaderSpi.getClassLoader(String) экземпляра поставщика, передавая codebase в качестве аргумента.

Если существует менеджер безопасности, его метод checkPermission будет вызван с разрешением RuntimePermission("getClassLoader"); это может привести к SecurityException. Реализация поставщика этого метода также может выполнить дополнительные проверки безопасности, чтобы убедиться, что контекст вызова имеет разрешение на подключение ко всем URL в пути URL кодовой базы.

Параметры:
codebase - список URL (разделенных пробелами) из которых возвращаемый загрузчик классов будет загружать классы, или null
Возвращает:
загрузчик классов, который загружает классы из указанного пути URL кодовой базы
Исключения:
MalformedURLException - если codebase не пустое и содержит некорректный URL, или если codebase равно null и URL, специфичный для поставщика, используемый для идентификации загрузчика классов, некорректен
SecurityException - если существует менеджер безопасности и вызов его метода checkPermission завершается ошибкой, или если у вызывающей стороны нет разрешения на подключение ко всем URL в пути URL кодовой базы
С:
1.3

getClassAnnotation

public static String getClassAnnotation(Class<?> cl)
Возвращает строку аннотации (представляющую расположение определения класса), которую RMI будет использовать для аннотирования описателя класса при маршаллировании объектов заданного класса.

Этот метод делегирует вызов методу RMIClassLoaderSpi.getClassAnnotation(Class) экземпляра поставщика, передавая cl в качестве аргумента.

Параметры:
cl - класс для получения аннотации
Возвращает:
строку, используемую для аннотирования данного класса при маршаллировании, или null
Исключения:
NullPointerException - если cl равно null
С:
1.2

getDefaultProviderInstance

public static RMIClassLoaderSpi getDefaultProviderInstance()
Возвращает канонический экземпляр по умолчанию для интерфейса поставщика сервисов RMIClassLoaderSpi. Если системная переменная java.rmi.server.RMIClassLoaderSpi не определена, то статические методы RMIClassLoader
  • loadClass(URL,String)
  • loadClass(String,String)
  • loadClass(String,String,ClassLoader)
  • loadProxyClass(String,String[],ClassLoader)
  • getClassLoader(String)
  • getClassAnnotation(Class)
будут использовать канонический экземпляр поставщика по умолчанию в качестве экземпляра поставщика сервисов.

Если установлен менеджер безопасности, то его метод checkPermission будет вызван с разрешением RuntimePermission("setFactory"); это может привести к SecurityException.

Экземпляр поставщика сервисов по умолчанию реализует RMIClassLoaderSpi следующим образом:

Метод getClassAnnotation возвращает String, представляющий путь к URL кодовой базы, который удалённая сторона должна использовать для загрузки определения указанного класса. Формат возвращаемой строки — это путь к URL, разделенные пробелами. Строка кодовой базы зависит от определяющего загрузчика классов указанного класса:

  • Если загрузчик классов — системный загрузчик (см. ClassLoader.getSystemClassLoader()), родительский загрузчик системного загрузчика, например, загрузчик, используемый для установленных расширений, или загрузчик загрузки (который может быть представлен как null), то возвращается значение системной переменной java.rmi.server.codebase (или, возможно, ранее кэшированное значение), или null, если эта переменная не задана.

  • В противном случае, если загрузчик классов является экземпляром URLClassLoader, то возвращаемая строка представляет собой список внешних форм URL, полученных путём вызова методов getURLs загрузчика. Если URLClassLoader был создан этим поставщиком для обслуживания вызова его методов loadClass или loadProxyClass, то для получения связанной строки кодовой базы разрешения не требуются. Если это любой другой экземпляр URLClassLoader, то если установлен менеджер безопасности, то его метод checkPermission будет вызываться один раз для каждого URL, возвращаемого методом getURLs, с разрешением, возвращаемым методом openConnection().getPermission() для каждого URL; если любой из этих вызовов сгенерирует исключение SecurityException или IOException, то возвращается значение переменной java.rmi.server.codebase (или, возможно, ранее кэшированное значение), или null, если эта переменная не задана.

  • Наконец, если загрузчик классов не является экземпляром URLClassLoader, то возвращается значение системной переменной java.rmi.server.codebase (или, возможно, ранее кэшированное значение), или null, если эта переменная не задана.

Для реализации методов, описанных ниже, которые все принимают параметр String под названием codebase, который представляет собой список URL, разделённых пробелами, каждый вызов имеет связанный с ним загрузчик кодовой базы, который определяется с помощью аргумента codebase в сочетании с загрузчиком контекста текущей потока (см. Thread.getContextClassLoader()). При наличии менеджера безопасности этот поставщик сохраняет внутреннюю таблицу экземпляров загрузчиков классов (которые, по крайней мере, являются экземплярами URLClassLoader), индексированную по паре родительского загрузчика классов и пути URL кодовой базы (упорядоченный список URL). Если аргумент codebase равен null, путь URL кодовой базы представляет собой значение системной переменной java.rmi.server.codebase или, возможно, ранее кэшированное значение. Для заданного пути URL кодовой базы, переданного в качестве аргумента codebase в вызов одного из нижеуказанных методов в определенном контексте, загрузчик кодовой базы — это загрузчик в таблице с указанным путём URL кодовой базы и загрузчиком контекста текущей потока в качестве родителя. Если такой загрузчик не существует, то он создается и добавляется в таблицу. Таблица не сохраняет сильные ссылки на содержащиеся в ней загрузчики, чтобы позволить им и их определённым классам быть удалены сборщиком мусора, когда они не достижимы другими способами. Для предотвращения неявной загрузки произвольного недоверенного кода в виртуальную машину без менеджера безопасности, если менеджер безопасности не установлен, загрузчик кодовой базы — это просто загрузчик контекста текущей потока (переданный путь URL кодовой базы игнорируется, поэтому удаленная загрузка классов отключена).

Метод getClassLoader возвращает загрузчик кодовой базы для указанного пути URL кодовой базы. Если установлен менеджер безопасности, то если контекст вызова не имеет разрешения на подключение ко всем URL в пути URL кодовой базы, будет выброшено исключение SecurityException.

Метод loadClass пытается загрузить класс с указанным именем следующим образом:

Если аргумент defaultLoader не null, то сначала пытается загрузить класс с указанным name с использованием defaultLoader, например, путём оценки
     Class.forName(name, false, defaultLoader)
 
. Если класс успешно загружен из defaultLoader, то этот класс возвращается. Если выброшено исключение, отличное от ClassNotFoundException, то это исключение выбрасывается вызывающему методу.

Затем метод loadClass пытается загрузить класс с указанным name с использованием загрузчика кодовой базы для указанного пути URL кодовой базы. Если установлен менеджер безопасности, то вызывающий контекст должен иметь разрешение на подключение ко всем URL в пути URL кодовой базы; в противном случае вместо загрузчика кодовой базы используется загрузчик контекста текущей потока.

Метод loadProxyClass пытается вернуть динамический класс прокси с указанным интерфейсом следующим образом:

Если аргумент defaultLoader не null и все указанные интерфейсы могут быть разрешены через этот загрузчик, то,

  • если все разрешенные интерфейсы являются public, то сначала пытается получить динамический класс прокси (с помощью Proxy.getProxyClass) для разрешенных интерфейсов, определенных в загрузчике кодовой базы; если эта попытка сгенерирует исключение IllegalArgumentException, то затем пытается получить динамический класс прокси для разрешенных интерфейсов, определенных в загрузчике контекста. Если обе попытки сгенерируют исключение IllegalArgumentException, то этот метод сгенерирует исключение ClassNotFoundException. Если выброшено любое другое исключение, то это исключение выбрасывается вызывающему методу.
  • если все разрешенные интерфейсы, не являющиеся public, определены в одном загрузчике классов, то пытается получить динамический класс прокси для разрешенных интерфейсов, определенных в этом загрузчике.
  • в противном случае вызывается исключение LinkageError (поскольку класс, реализующий все указанные интерфейсы, не может быть определен ни в каком загрузчике).

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

  • если все разрешенные интерфейсы являются public, то пытается получить динамический класс прокси для разрешенных интерфейсов в загрузчике кодовой базы. Если попытка сгенерирует исключение IllegalArgumentException, то этот метод сгенерирует исключение ClassNotFoundException.
  • если все разрешенные интерфейсы, не являющиеся public, определены в одном загрузчике классов, то пытается получить динамический класс прокси для разрешенных интерфейсов, определенных в этом загрузчике.
  • в противном случае вызывается исключение LinkageError (поскольку класс, реализующий все указанные интерфейсы, не может быть определен ни в каком загрузчике).

В противном случае вызывается исключение ClassNotFoundException для одного из указанных интерфейсов, который не смог быть разрешен.

Returns:
канонический экземпляр поставщика сервисов по умолчанию
Throws:
SecurityException - если установлен менеджер безопасности и вызов его метода checkPermission завершился с ошибкой
Since:
1.4

getSecurityContext

@Deprecated public static Object getSecurityContext(ClassLoader loader)
Устарело.
замены нет. Начиная с платформы Java 2 v1.2, RMI больше не использует этот метод для получения контекста безопасности загрузчика классов.
Возвращает контекст безопасности заданного загрузчика классов.
Parameters:
loader - загрузчик классов, контекст безопасности которого требуется получить
Returns:
контекст безопасности
See Also:
  • SecurityManager.getSecurityContext()

© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/java.rmi/java/rmi/server/RMIClassLoader.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API