Spec-Zone.ru › OpenJDK 24

Класс RMIClassLoader

java.lang.Object
java.rmi.server.RMIClassLoader
public class RMIClassLoader extends Object
RMIClassLoader содержит статические методы для поддержки динамической загрузки классов с помощью RMI. Включает методы для загрузки классов из сетевого расположения (одного или нескольких URL-адресов) и получения расположения, из которого существующий класс должен быть загружен удалёнными сторонами. Эти методы используются во время выполнения 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().
С тех пор:
1.1
См. также:
  • RMIClassLoaderSpi

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

Модификатор и тип Метод Описание
static String getClassAnnotation(Class<?> cl)
Возвращает строку аннотации (представляющую расположение определения класса), которую RMI будет использовать для аннотирования описания класса при сериализации объектов данного класса.
static ClassLoader getClassLoader(String codebase)
Возвращает загрузчик классов, который загружает классы из указанного пути URL-адреса кодовой базы.
static RMIClassLoaderSpi getDefaultProviderInstance()
Возвращает канонический экземпляр по умолчанию для интерфейса поставщика услуг RMIClassLoaderSpi.
static Object getSecurityContext(ClassLoader loader)
Deprecated.
без замены.
static Class<?> loadClass(String name)
Deprecated.
заменён методом 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
Возвращает загрузчик классов, который загружает классы из указанного пути URL кодовой базы.

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

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

Параметры:
codebase - список URL (разделенные пробелами) для загрузки классов, или null
Возвращает:
загрузчик классов, который загружает классы из указанного пути URL кодовой базы
Исключения:
MalformedURLException - если codebase не пустое и содержит некорректный URL, или если codebase имеет значение null и 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)
будут использовать каноничный экземпляр поставщика по умолчанию в качестве экземпляра поставщика услуг.

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

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

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

  • В противном случае, если загрузчик классов является экземпляром URLClassLoader, возвращаемая строка — это список, разделенный пробелами, внешних форм URL-адресов, возвращаемых при вызове методов getURLs загрузчика.

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

Для реализаций методов, описанных ниже, все из которых принимают параметр String с именем codebase, представляющий собой список URL-адресов, разделённых пробелами, аргумент codebase игнорируется. Загрузка класса происходит с использованием контекстного загрузчика классов текущей нити (см. Thread.getContextClassLoader()), который также считается загрузчиком кодовой базы, независимо от любого значения, переданного в качестве аргумента codebase.

Метод getClassLoader возвращает контекстный загрузчик классов текущей нити.

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

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

Затем метод loadClass пытается загрузить класс с указанным name с использованием контекстного загрузчика классов текущей нити.

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

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

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

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

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

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

Возвращает:
каноничный экземпляр поставщика услуг по умолчанию
С момента:
1.4

getSecurityContext

@Deprecated public static Object getSecurityContext(ClassLoader loader)
Устарело.
без замены. Этот метод не имеет цели в отсутствие менеджера безопасности.
Всегда возвращает null.
Параметры:
loader - загрузчик классов, из которого получить контекст безопасности
Возвращает:
null

© 1993, 2025, 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://download.java.net/java/early_access/jdk24/docs/api/java.rmi/java/rmi/server/RMIClassLoader.html

Spec-Zone.ru

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