Класс RMIClassLoader

public class RMIClassLoader
extends Object

RMIClassLoader включает статические методы для поддержки динамической загрузки классов с RMI. Включают методы для загрузки классов из сетевого местоположения (одного или нескольких URL-адресов) и получения местоположения, из которого существующий класс должен загружаться удалёнными сторонами. Эти методы используются RMI-средой при сериализации и десериализации классов, содержащихся в аргументах и значениях возвращаемых значений вызовов удалённых методов, и их также можно вызывать напрямую приложениями, чтобы имитировать поведение динамической загрузки классов RMI.

Реализация следующих статических методов

предоставляется экземпляром 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()

Возвращает канонический экземпляр стандартного поставщика для интерфейса поставщика услуг RMIClassLoaderSpi.

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)

Загружает динамический класс прокси (см. Proxy), который реализует набор интерфейсов с заданными именами из пути URL кодовой базы.

Методы, объявленные в классе 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

будут использовать канонический экземпляр по умолчанию в качестве экземпляра поставщика услуг.

Если менеджер безопасности существует, его метод 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)
Устарел.
замены нет. Начиная с Java 2 платформы v1.2, RMI больше не использует этот метод для получения контекста безопасности загрузчика классов.

Возвращает контекст безопасности данного загрузчика классов.

Параметры:
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

Spec-Zone .ru
спецификации, руководства, описания, API