Класс 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().
- С момента:
- 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не пусто и содержит некорректный 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не пустой, он сначала пытается загрузить класс с указаннымnameс помощьюdefaultLoader, например, вычисливClass.forName(name, false, defaultLoader). Если класс успешно загружен изdefaultLoader, этот класс возвращается. Если возникнет исключение, отличное отClassNotFoundException, это исключение перебрасывается вызывающему методу.Далее, метод
loadClassпытается загрузить класс с указаннымnameс помощью загрузчика кодовой базы для указанного пути к URL кодовой базы. Если существует менеджер безопасности, то контекст вызова должен иметь разрешение на подключение ко всем URL в пути к URL кодовой базы; в противном случае, вместо загрузчика кодовой базы будет использоваться контекстный загрузчик классов текущей нити.Метод
loadProxyClassпытается вернуть динамический класс прокси с указанным интерфейсом следующим образом:Если аргумент
defaultLoaderне пустой и все именованные интерфейсы могут быть разрешены через этот загрузчик, то,
- если все разрешённые интерфейсы являются
public, то он сначала пытается получить динамический класс прокси (используяProxy.getProxyClass) для разрешённых интерфейсов, определённых в загрузчике кодовой базы; если эта попытка сгенерируетIllegalArgumentException, то он пытается получить динамический класс прокси для разрешенных интерфейсов, определённых вdefaultLoader. Если обе попытки сгенерируютIllegalArgumentException, то этот метод генерируетClassNotFoundException. Если будет сгенерировано любое другое исключение, то это исключение перебрасывается вызывающему методу.- если все не-
publicразрешённые интерфейсы определены в одном и том же загрузчике классов, то он пытается получить динамический класс прокси для разрешённых интерфейсов, определённых в этом загрузчике.- в противном случае генерируется исключение
LinkageError(потому что класс, реализующий все указанные интерфейсы, не может быть определён ни в одном загрузчике).В противном случае, если все именованные интерфейсы могут быть разрешены через загрузчик кодовой базы, то,
- если все разрешённые интерфейсы являются
public, то он пытается получить динамический класс прокси для разрешенных интерфейсов в загрузчике кодовой базы. Если попытка генерируетIllegalArgumentException, то этот метод генерируетClassNotFoundException.- если все не-
publicразрешённые интерфейсы определены в одном и том же загрузчике классов, то он пытается получить динамический класс прокси для разрешённых интерфейсов, определённых в этом загрузчике.- в противном случае генерируется исключение
LinkageError(потому что класс, реализующий все указанные интерфейсы, не может быть определён ни в одном загрузчике).В противном случае генерируется исключение
ClassNotFoundExceptionдля одного из именованных интерфейсов, который не удалось разрешить.
- Возвращает:
- канонический экземпляр поставщика по умолчанию
- Выбрасывает:
-
SecurityException- если менеджер безопасности существует и вызов его методаcheckPermissionзавершается неудачей - С:
- 1.4
getSecurityContext
@Deprecated public static Object getSecurityContext(ClassLoader loader)
- Параметры:
-
loader- загрузчик классов, из которого нужно получить контекст безопасности - Возвращает:
- контекст безопасности
- См. также:
© 1993, 2021, 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/17/docs/api/java.rmi/java/rmi/server/RMIClassLoader.html