Класс 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
- См. также:
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static String |
getClassAnnotation |
Возвращает строку аннотации (представляющую местоположение определения класса), которую RMI будет использовать для аннотирования дескриптора класса при маршализации объектов данного класса. |
static ClassLoader |
getClassLoader |
Возвращает загрузчик классов, загружающий классы по указанному пути URL кодовой базы. |
static RMIClassLoaderSpi |
getDefaultProviderInstance() |
Возвращает канонический экземпляр поставщика по умолчанию для интерфейса поставщика услуг RMIClassLoaderSpi. |
static Object |
getSecurityContext |
Устарел. замены нет. |
static Class |
loadClass |
Устарел. заменён методом 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не равенnullи содержит недопустимый 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не равен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
Возвращаемый загрузчик классов — это загрузчик, который метод 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)
Этот метод делегирует вызов методу 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://docs.oracle.com/en/java/javase/25/docs/api/java.rmi/java/rmi/server/RMIClassLoader.html