Spec-Zone.ru › OpenJDK 27

Класс 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 и имеет открытый конструктор без аргументов, этот конструктор будет вызван для создания экземпляра поставщика. Если свойство задано, но любое из остальных условий не выполняется, коду, пытающемуся использовать RMIClassLoader, будет выброшено исключение Error (конкретный тип не определён), указывающее на невозможность получить экземпляр поставщика.
  • Если системному загрузчику классов доступен ресурс с именем META-INF/services/java.rmi.server.RMIClassLoaderSpi, его содержимое интерпретируется как файл конфигурации поставщика, а имя первого класса, указанное в этом файле, используется в качестве имени класса поставщика. Если класс с таким именем можно загрузить системным загрузчиком классов, этот класс является подтипом RMIClassLoaderSpi и имеет открытый конструктор без аргументов, этот конструктор будет вызван для создания экземпляра поставщика. Если ресурс найден, но создать экземпляр поставщика описанным способом не удалось, коду, пытающемуся использовать RMIClassLoader, будет выброшено исключение Error (конкретный тип не определён), указывающее на невозможность получить экземпляр поставщика.
  • В противном случае экземпляром поставщика будет значение, возвращаемое при вызове метода 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)
Устарел.
замены нет.
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 кодовой базы.

Методы, объявленные в классе Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Модификатор и тип Метод Описание
protected Object clone()
Создаёт и возвращает копию этого объекта.
boolean equals(Object obj)
Показывает, равен ли этот объект какому-либо другому объекту.
protected void finalize()
Устарел, будет удалён: этот элемент API может быть удалён в будущей версии.
Финализация объявлена устаревшей и подлежит удалению в одном из будущих выпусков.
final Class<?> getClass()
Возвращает класс времени выполнения этого Object.
int hashCode()
Возвращает хеш-код этого объекта.
final void notify()
Пробуждает один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Пробуждает все потоки, ожидающие на мониторе этого объекта.
String toString()
Возвращает строковое представление объекта.
final void wait()
Переводит текущий поток в состояние ожидания до пробуждения, обычно в результате вызова notify или interrupt.
final void wait(long timeoutMillis)
Переводит текущий поток в состояние ожидания до пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного промежутка реального времени.
final void wait(long timeoutMillis, int nanos)
Переводит текущий поток в состояние ожидания до пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного промежутка реального времени.

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

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 не равен null и содержит недействительный 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 не равен null и содержит недействительный 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 не равен null и содержит недействительный 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 не равен null и содержит недействительный 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

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторское право © 1993, 2026, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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.

Spec-Zone.ru

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