Spec-Zone.ru › OpenJDK 8

Класс 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:
JDK1.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)

Устарело.

Без замены. Начиная с платформы Java 2 v1.2, RMI больше не использует этот метод для получения контекста безопасности загрузчика классов.

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

Загружает класс по пути в кодовом базисе.

Этот метод делегирует вызов методу 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

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

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 platform 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.

Spec-Zone.ru

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