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