Класс RMIClassLoader
- java.lang.Object
-
- java.rmi.server.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:
RMIClassLoaderSpi
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
static String | getClassAnnotation(Class<?> cl) | Возвращает строку аннотации (представляющую местоположение определения класса), которую RMI будет использовать для аннотирования описателя класса при сериализации объектов данного класса. |
static ClassLoader | getClassLoader(String codebase) | Возвращает загрузчик классов, который загружает классы из заданного пути URL кодовой базы. |
static RMIClassLoaderSpi | getDefaultProviderInstance() | Возвращает канонический экземпляр стандартного поставщика для интерфейса поставщика услуг |
static Object | getSecurityContext(ClassLoader loader) | Устарело. нет замены. |
static Class<?> | loadClass(String name) | Устарело. заменено методом loadClass(String,String) |
static Class<?> | loadClass(String codebase,
String name) | Загружает класс из пути URL кодовой базы. |
static Class<?> | loadClass(String codebase,
String name,
ClassLoader defaultLoader) | Загружает класс из пути URL кодовой базы, необязательно используя предоставленный загрузчик. |
static Class<?> | loadClass(URL codebase,
String name) | Загружает класс из URL-адреса кодовой базы. |
static Class<?> | loadProxyClass(String codebase,
String[] interfaces,
ClassLoader defaultLoader) | Загружает динамический класс прокси (см. |
Методы, объявленные в классе java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Методы
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(String,String)
loadClass
public static Class<?> loadClass(URL codebase,
String name)
throws MalformedURLException,
ClassNotFoundException Загружает класс из URL кодовой базы. Если 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 Загружает класс из пути URL кодовой базы.
Этот метод делегирует вызов методу 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 Загружает класс из пути URL кодовой базы, необязательно используя предоставленный загрузчик. Этот метод следует использовать, когда вызывающий объект хочет предоставить реализующей стороне поставщика дополнительный контекстный загрузчик классов для рассмотрения, такой как загрузчик вызывающего объекта в стеке. Обычно реализация поставщика попытается разрешить именованный класс с помощью данного 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,
SecurityException Возвращает загрузчик классов, который загружает классы из заданного пути URL кодовой базы.
Возвращаемый загрузчик классов — это загрузчик классов, который метод loadClass(String,String) использовал бы для загрузки классов для того же аргумента codebase.
Этот метод делегирует вызов методу RMIClassLoaderSpi.getClassLoader(String) экземпляра поставщика, передавая codebase в качестве аргумента.
Если существует менеджер безопасности, его метод checkPermission будет вызван с разрешением RuntimePermission("getClassLoader"); это может привести к SecurityException. Реализация поставщика этого метода также может выполнить дополнительные проверки безопасности, чтобы убедиться, что вызывающий контекст имеет разрешение на подключение ко всем URL в пути URL кодовой базы.
- Параметры:
-
codebase- список URL (разделенных пробелами) из которых возвращаемый загрузчик классов будет загружать классы, илиnull - Возвращает:
- загрузчик классов, который загружает классы из заданного пути URL кодовой базы
- Исключения:
-
MalformedURLException- еслиcodebaseнеnullи содержит недействительный URL, или еслиcodebaseравноnullи URL, специфичный для поставщика, используемый для идентификации загрузчика классов, недействителен -
SecurityException- если существует менеджер безопасности, и вызов его методаcheckPermissionзавершился неудачно, или если у вызывающего контекста нет разрешения на подключение ко всем URL в пути URL кодовой базы - С момента:
- 1.3
getClassAnnotation
public static String getClassAnnotation(Class<?> cl)
Возвращает строку аннотации (представляющую расположение определения класса), которую RMI будет использовать для аннотации описателя класса при сериализации объектов данного класса.
Этот метод делегирует вызов методу 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пытается загрузить класс с указанным именем следующим образом:If the defaultLoader argument is non-null, it first attempts to load the class with the specified name using the defaultLoader, such as by evaluating Class.forName(name, false, defaultLoader) If the class is successfully loaded from the defaultLoader, that class is returned. If an exception other than ClassNotFoundException is thrown, that exception is thrown to the caller. Next, the loadClass method attempts to load the class with the specified name using the codebase loader for the specified codebase URL path. If there is a security manager, then the calling context must have permission to connect to all of the URLs in the codebase URL path; otherwise, the current thread's context class loader will be used instead of the codebase loader.Метод
loadProxyClassпытается вернуть динамический класс прокси с указанным интерфейсом следующим образом:Если аргумент
defaultLoaderнеnullи все указанные интерфейсы могут быть разрешены через этот загрузчик, то,
- если все разрешенные интерфейсы являются
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- загрузчик классов, из которого необходимо получить контекст безопасности - Возвращает:
- контекст безопасности
- См. также:
SecurityManager.getSecurityContext()
© 1993, 2020, 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/11/docs/api/java.rmi/java/rmi/server/RMIClassLoader.html