Класс RMIClassLoader
public class RMIClassLoader extends Object
RMIClassLoader включает статические методы для поддержки динамической загрузки классов с использованием RMI. Включает методы для загрузки классов из сетевого местоположения (одного или нескольких URL) и получения местоположения, из которого существующий класс должен быть загружен удалёнными сторонами. Эти методы используются RMI-средой при сериализации и десериализации классов, содержащихся в аргументах и возвращаемых значениях вызовов удалённых методов, а также могут вызываться напрямую приложениями для имитации поведения динамической загрузки классов 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().
- Since:
- 1.1
- See Also:
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
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не пустое и содержит некорректный 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, SecurityException
Возвращаемый загрузчик классов — это загрузчик классов, который метод loadClass(String,String) использовал бы для загрузки классов для того же аргумента codebase.
Этот метод делегирует вызов методу RMIClassLoaderSpi.getClassLoader(String) экземпляра поставщика, передавая codebase в качестве аргумента.
Если существует менеджер безопасности, его метод checkPermission будет вызван с разрешением RuntimePermission("getClassLoader"); это может привести к SecurityException. Реализация поставщика этого метода также может выполнить дополнительные проверки безопасности, чтобы убедиться, что контекст вызова имеет разрешение на подключение ко всем URL в пути URL кодовой базы.
- Параметры:
-
codebase- список URL (разделенных пробелами) из которых возвращаемый загрузчик классов будет загружать классы, илиnull - Возвращает:
- загрузчик классов, который загружает классы из указанного пути URL кодовой базы
- Исключения:
-
MalformedURLException- еслиcodebaseне пустое и содержит некорректный URL, или еслиcodebaseравноnullи URL, специфичный для поставщика, используемый для идентификации загрузчика классов, некорректен -
SecurityException- если существует менеджер безопасности и вызов его методаcheckPermissionзавершается ошибкой, или если у вызывающей стороны нет разрешения на подключение ко всем URL в пути 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)
Если установлен менеджер безопасности, то его метод checkPermission будет вызван с разрешением RuntimePermission("setFactory"); это может привести к SecurityException.
Экземпляр поставщика сервисов по умолчанию реализует RMIClassLoaderSpi следующим образом:
Метод
getClassAnnotationвозвращаетString, представляющий путь к URL кодовой базы, который удалённая сторона должна использовать для загрузки определения указанного класса. Формат возвращаемой строки — это путь к URL, разделенные пробелами. Строка кодовой базы зависит от определяющего загрузчика классов указанного класса:
Если загрузчик классов — системный загрузчик (см.
ClassLoader.getSystemClassLoader()), родительский загрузчик системного загрузчика, например, загрузчик, используемый для установленных расширений, или загрузчик загрузки (который может быть представлен какnull), то возвращается значение системной переменнойjava.rmi.server.codebase(или, возможно, ранее кэшированное значение), илиnull, если эта переменная не задана.В противном случае, если загрузчик классов является экземпляром
URLClassLoader, то возвращаемая строка представляет собой список внешних форм URL, полученных путём вызова методовgetURLsзагрузчика. ЕслиURLClassLoaderбыл создан этим поставщиком для обслуживания вызова его методовloadClassилиloadProxyClass, то для получения связанной строки кодовой базы разрешения не требуются. Если это любой другой экземплярURLClassLoader, то если установлен менеджер безопасности, то его методcheckPermissionбудет вызываться один раз для каждого URL, возвращаемого методомgetURLs, с разрешением, возвращаемым методомopenConnection().getPermission()для каждого URL; если любой из этих вызовов сгенерирует исключениеSecurityExceptionилиIOException, то возвращается значение переменнойjava.rmi.server.codebase(или, возможно, ранее кэшированное значение), илиnull, если эта переменная не задана.Наконец, если загрузчик классов не является экземпляром
URLClassLoader, то возвращается значение системной переменнойjava.rmi.server.codebase(или, возможно, ранее кэшированное значение), илиnull, если эта переменная не задана.Для реализации методов, описанных ниже, которые все принимают параметр
Stringпод названиемcodebase, который представляет собой список URL, разделённых пробелами, каждый вызов имеет связанный с ним загрузчик кодовой базы, который определяется с помощью аргументаcodebaseв сочетании с загрузчиком контекста текущей потока (см.Thread.getContextClassLoader()). При наличии менеджера безопасности этот поставщик сохраняет внутреннюю таблицу экземпляров загрузчиков классов (которые, по крайней мере, являются экземплярамиURLClassLoader), индексированную по паре родительского загрузчика классов и пути URL кодовой базы (упорядоченный список URL). Если аргументcodebaseравенnull, путь URL кодовой базы представляет собой значение системной переменнойjava.rmi.server.codebaseили, возможно, ранее кэшированное значение. Для заданного пути URL кодовой базы, переданного в качестве аргументаcodebaseв вызов одного из нижеуказанных методов в определенном контексте, загрузчик кодовой базы — это загрузчик в таблице с указанным путём URL кодовой базы и загрузчиком контекста текущей потока в качестве родителя. Если такой загрузчик не существует, то он создается и добавляется в таблицу. Таблица не сохраняет сильные ссылки на содержащиеся в ней загрузчики, чтобы позволить им и их определённым классам быть удалены сборщиком мусора, когда они не достижимы другими способами. Для предотвращения неявной загрузки произвольного недоверенного кода в виртуальную машину без менеджера безопасности, если менеджер безопасности не установлен, загрузчик кодовой базы — это просто загрузчик контекста текущей потока (переданный путь URL кодовой базы игнорируется, поэтому удаленная загрузка классов отключена).Метод
getClassLoaderвозвращает загрузчик кодовой базы для указанного пути URL кодовой базы. Если установлен менеджер безопасности, то если контекст вызова не имеет разрешения на подключение ко всем URL в пути URL кодовой базы, будет выброшено исключениеSecurityException.Метод
loadClassпытается загрузить класс с указанным именем следующим образом:Если аргументdefaultLoaderнеnull, то сначала пытается загрузить класс с указаннымnameс использованиемdefaultLoader, например, путём оценкиClass.forName(name, false, defaultLoader). Если класс успешно загружен изdefaultLoader, то этот класс возвращается. Если выброшено исключение, отличное отClassNotFoundException, то это исключение выбрасывается вызывающему методу.Затем метод
loadClassпытается загрузить класс с указаннымnameс использованием загрузчика кодовой базы для указанного пути URL кодовой базы. Если установлен менеджер безопасности, то вызывающий контекст должен иметь разрешение на подключение ко всем URL в пути URL кодовой базы; в противном случае вместо загрузчика кодовой базы используется загрузчик контекста текущей потока.Метод
loadProxyClassпытается вернуть динамический класс прокси с указанным интерфейсом следующим образом:Если аргумент
defaultLoaderнеnullи все указанные интерфейсы могут быть разрешены через этот загрузчик, то,
- если все разрешенные интерфейсы являются
public, то сначала пытается получить динамический класс прокси (с помощьюProxy.getProxyClass) для разрешенных интерфейсов, определенных в загрузчике кодовой базы; если эта попытка сгенерирует исключениеIllegalArgumentException, то затем пытается получить динамический класс прокси для разрешенных интерфейсов, определенных в загрузчике контекста. Если обе попытки сгенерируют исключениеIllegalArgumentException, то этот метод сгенерирует исключениеClassNotFoundException. Если выброшено любое другое исключение, то это исключение выбрасывается вызывающему методу.- если все разрешенные интерфейсы, не являющиеся
public, определены в одном загрузчике классов, то пытается получить динамический класс прокси для разрешенных интерфейсов, определенных в этом загрузчике.- в противном случае вызывается исключение
LinkageError(поскольку класс, реализующий все указанные интерфейсы, не может быть определен ни в каком загрузчике).В противном случае, если все указанные интерфейсы могут быть разрешены через загрузчик кодовой базы, то,
- если все разрешенные интерфейсы являются
public, то пытается получить динамический класс прокси для разрешенных интерфейсов в загрузчике кодовой базы. Если попытка сгенерирует исключениеIllegalArgumentException, то этот метод сгенерирует исключениеClassNotFoundException.- если все разрешенные интерфейсы, не являющиеся
public, определены в одном загрузчике классов, то пытается получить динамический класс прокси для разрешенных интерфейсов, определенных в этом загрузчике.- в противном случае вызывается исключение
LinkageError(поскольку класс, реализующий все указанные интерфейсы, не может быть определен ни в каком загрузчике).В противном случае вызывается исключение
ClassNotFoundExceptionдля одного из указанных интерфейсов, который не смог быть разрешен.
- Returns:
- канонический экземпляр поставщика сервисов по умолчанию
- Throws:
-
SecurityException- если установлен менеджер безопасности и вызов его методаcheckPermissionзавершился с ошибкой - Since:
- 1.4
getSecurityContext
@Deprecated public static Object getSecurityContext(ClassLoader loader)
- Parameters:
-
loader- загрузчик классов, контекст безопасности которого требуется получить - Returns:
- контекст безопасности
- See Also:
© 1993, 2023, 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/21/docs/api/java.rmi/java/rmi/server/RMIClassLoader.html