Spec-Zone.ru › OpenJDK 25

Класс 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

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

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, 2025, 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.
https://docs.oracle.com/en/java/javase/25/docs/api/java.rmi/java/rmi/server/RMIClassLoader.html

Spec-Zone.ru

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