Класс 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 кодовой базы. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Показывает, равен ли этот объект какому-либо другому объекту. |
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 |
Переводит текущий поток в состояние ожидания до пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного промежутка реального времени. |
final void |
wait |
Переводит текущий поток в состояние ожидания до пробуждения, обычно в результате вызова 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
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.