Spec-Zone.ru › OpenJDK 17

Класс 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().
С момента:
1.1
См. также:
  • 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 не пусто и содержит некорректный 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 не пусто и содержит некорректный 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
Возвращает загрузчик классов, который загружает классы из заданного пути к URL-адресу кодовой базы.

Возвращаемый загрузчик классов — это загрузчик, который метод 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)
Возвращает строку аннотации (представляющую расположение определения класса), которую 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 пытается загрузить класс с указанным именем следующим образом:

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

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API