|
Spec-Zone .ru
спецификации, руководства, описания, API
|
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() метод. 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. |
@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)public static Class<?> loadClass(URL codebase, String name) throws MalformedURLException, ClassNotFoundException
codebase null, тогда этот метод будет вести себя то же самое как loadClass(String,String) с a null codebase и данное имя класса. Этот метод делегирует к RMIClassLoaderSpi.loadClass(String,String,ClassLoader) метод экземпляра провайдера, передавая результат вызова URL.toString() на данном URL (или null если codebase нуль) как первый параметр, name как второй параметр, и null как третий параметр.
codebase - URL, чтобы загрузить класс из, или nullname - имя класса загрузкиClass объект, представляющий загруженный классMalformedURLException - если codebase null и специфичный для провайдера URL, используемый, чтобы загрузить классы, недопустимClassNotFoundException - если определение для класса не могло бы быть найдено в указанном URLpublic static Class<?> loadClass(String codebase, String name) throws MalformedURLException, ClassNotFoundException
Этот метод делегирует к RMIClassLoaderSpi.loadClass(String,String,ClassLoader) метод экземпляра провайдера, передавая codebase как первый параметр, name как второй параметр, и null как третий параметр.
codebase - список URL (разделенный пробелами), чтобы загрузить класс из, или nullname - имя класса загрузкиClass объект, представляющий загруженный классMalformedURLException - если codebase не -null и содержит недопустимый URL, или если codebase null и специфичный для провайдера URL, используемый, чтобы загрузить классы, недопустимClassNotFoundException - если определение для класса не могло бы быть найдено в указанном расположении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 (разделенный пробелами), чтобы загрузить класс из, или nullname - имя класса загрузкиdefaultLoader - дополнительный контекстный загрузчик класса, чтобы использовать, или nullClass объект, представляющий загруженный классMalformedURLException - если codebase не -null и содержит недопустимый URL, или если codebase null и специфичный для провайдера URL, используемый, чтобы загрузить классы, недопустимClassNotFoundException - если определение для класса не могло бы быть найдено в указанном расположении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 (разделенных пробелом), чтобы загрузить классы из, или nullinterfaces - имена интерфейсов для прокси-класса, чтобы реализоватьdefaultLoader - дополнительный контекстный загрузчик класса, чтобы использовать, или nullMalformedURLException - если codebase не -null и содержит недопустимый URL, или если codebase null и специфичный для провайдера URL, используемый, чтобы загрузить классы, недопустимClassNotFoundException - если определение для одного из именованных интерфейсов не могло бы быть найдено в указанном расположении, или если создание динамического отказавшего прокси-класса (такой, как будто Proxy.getProxyClass(ClassLoader,Class[]) бросил бы IllegalArgumentException для данного интерфейсного списка)public static ClassLoader getClassLoader(String codebase) throws MalformedURLException, SecurityException
Возвращенный загрузчик класса является загрузчиком класса что loadClass(String,String) метод использовал бы, чтобы загрузить классы для того же самого codebase параметр.
Этот метод делегирует к RMIClassLoaderSpi.getClassLoader(String) метод экземпляра провайдера, передавая codebase как параметр.
Если есть кормушка безопасности, checkPermission метод будет вызван с a RuntimePermission("getClassLoader") разрешение; это могло привести к a SecurityException. Реализация провайдера этого метода может также выполнить дальнейшие проверки безопасности, чтобы проверить, что у контекста вызова есть разрешение, чтобы соединить со всеми URL в кодовой базе путь URL.
codebase - список URL (разделенных пробелом), от которого возвращенный загрузчик класса загрузит классы из, или nullMalformedURLException - если codebase не -null и содержит недопустимый URL, или если codebase null и специфичный для провайдера URL, используемый, чтобы идентифицировать загрузчик класса, недопустимSecurityException - если есть менеджер безопасности и вызов checkPermission сбои метода, или если у вызывающей стороны нет разрешения, чтобы соединить со всеми URL в кодовой базе путь URLpublic static String getClassAnnotation(Class<?> cl)
Этот метод делегирует к RMIClassLoaderSpi.getClassAnnotation(Class) метод экземпляра провайдера, передавая cl как параметр.
cl - класс, чтобы получить аннотацию дляnullNullPointerException - если cl nullpublic 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 метод будет вызван с a RuntimePermission("setFactory") разрешение; это могло привести к a SecurityException.
Реализации экземпляра поставщика услуг по умолчанию RMIClassLoaderSpi следующим образом:
getClassAnnotationметод возвращает aStringпредставление кодовой базы путь URL, который удаленная сторона должна использовать, чтобы загрузить определение для указанного класса. Формат возвращенной строки является путем URL, разделенных пробелами. Возвращенная строка кодовой базы зависит от загрузчика класса определения указанного класса:
- Если загрузчик класса является системным загрузчиком класса (см.
ClassLoader.getSystemClassLoader()), родитель системного загрузчика класса, такого как загрузчик, используемый для установленных расширений, или загрузчика класса начальной загрузки (который может быть представленnull), тогда значениеjava.rmi.server.codebaseсвойство (или возможно более раннее кэшируемое значение) возвращается, илиnullвозвращается, если то свойство не устанавливается.- Иначе, если загрузчик класса является экземпляром
URLClassLoader, тогда возвращенная строка является разделенным пробелом списком внешних форм URL, возвращенных, вызываяgetURLsметоды загрузчика. ЕслиURLClassLoaderсоздавался этим провайдером, чтобы обслужить вызовloadClassилиloadProxyClassметоды, тогда никакие полномочия не обязаны получать связанную строку кодовой базы. Если это - произвольный другойURLClassLoaderэкземпляр, затем если есть менеджер безопасности,checkPermissionметод будет вызван однажды для каждого URL, возвращенногоgetURLsметод, с разрешением, возвращенным, вызываяopenConnection().getPermission()на каждом URL; если какой-либо из тех вызовов бросает aSecurityExceptionилиIOException, тогда значениеjava.rmi.server.codebaseсвойство (или возможно более раннее кэшируемое значение) возвращается, илиnullвозвращается, если то свойство не устанавливается.- Наконец, если загрузчик класса не является экземпляром
URLClassLoader, тогда значениеjava.rmi.server.codebaseсвойство (или возможно более раннее кэшируемое значение) возвращается, илиnullвозвращается, если то свойство не устанавливается.Для реализаций методов, описанных ниже, который все берут a
Stringпараметр называютcodebaseэто - разделенный пробелом список URL, у каждого вызова есть связанный загрузчик кодовой базы, который идентифицируется, используяcodebaseпараметр в соединении с загрузчиком класса контекста текущего потока (см.Thread.getContextClassLoader()). Когда есть менеджер безопасности, этот провайдер поддерживает внутреннюю таблицу экземпляров загрузчика класса (которые являются, по крайней мере, экземплярамиURLClassLoader) включенный парой их загрузчика родительского класса и их кодовой базы путь URL (упорядоченный список URL). Еслиcodebaseпараметрnull, кодовая база путь URL является значением системного свойстваjava.rmi.server.codebaseили возможно более раннее кэшируемое значение. Для данной кодовой базы путь URL, который передают какcodebaseпараметр вызову одного из ниже методов в данном контексте, загрузчик кодовой базы является загрузчиком в таблице с указанной кодовой базой путь URL и загрузчик класса контекста текущего потока как его родитель. Если никакой такой загрузчик не существует, то каждый создается и добавляется к таблице. Таблица не поддерживает сильные ссылки на свои содержавшие загрузчики, чтобы позволить им и их определенным классам быть собранными "мусор" если не иначе достижимые. Чтобы препятствовать тому, чтобы произвольный недоверяемый код был неявно загружен в виртуальную машину без менеджера безопасности, если нет никакого набора менеджера безопасности, загрузчик кодовой базы является только загрузчиком класса контекста текущего потока (предоставленная кодовая база, путь URL игнорируется, таким образом, удаленная загрузка класса отключается).
getClassLoaderметод возвращает загрузчик кодовой базы для указанной кодовой базы путь URL. Если есть менеджер безопасности, то, если у контекста вызова нет разрешения, чтобы соединить со всеми URL в кодовой базе путь URL, aSecurityExceptionбудет брошен.
loadClassметод пытается загрузить класс указанным именем следующим образом:ЕслиdefaultLoaderпараметр не -null, это сначала пытается загрузить класс указаннымnameиспользованиеdefaultLoader, такой как, оцениваяClass.forName(name, false, defaultLoader)Если класс успешно загружается изdefaultLoader, тот класс возвращается. Если исключение кромеClassNotFoundExceptionбросается, то исключение выдается к вызывающей стороне.Затем,
loadClassметод пытается загрузить класс указаннымnameиспользование загрузчика кодовой базы для указанной кодовой базы путь URL. Если есть менеджер безопасности, то у контекста вызова должно быть разрешение, чтобы соединить со всеми URL в кодовой базе путь URL; иначе, загрузчик класса контекста текущего потока будет использоваться вместо загрузчика кодовой базы.
loadProxyClassметод пытается возвратить динамический прокси-класс с именованным интерфейсом следующим образом:Если
defaultLoaderпараметр не -nullи все именованные интерфейсы могут быть разрешены через тот загрузчик, тогда,
- если все разрешенные интерфейсы
public, тогда это сначала пытается получить динамический прокси-класс (использованиеProxy.getProxyClass) для разрешенных интерфейсов, определенных в загрузчике кодовой базы; если та попытка бросаетIllegalArgumentException, это тогда пытается получить динамический прокси-класс для разрешенных интерфейсов, определенных вdefaultLoader. Если обе попытки бросаютIllegalArgumentException, тогда этот метод бросает aClassNotFoundException. Если какое-либо другое исключение выдается, то исключение выдается к вызывающей стороне.- если весь из не -
publicразрешенные интерфейсы определяются в том же самом загрузчике класса, тогда он пытается получить динамический прокси-класс для разрешенных интерфейсов, определенных в том загрузчике.- иначе, a
LinkageErrorбросается (потому что класс, который реализует все указанные интерфейсы, не может быть определен ни в каком загрузчике).Иначе, если все именованные интерфейсы могут быть разрешены через загрузчик кодовой базы, то,
- если все разрешенные интерфейсы
public, тогда это пытается получить динамический прокси-класс для разрешенных интерфейсов в загрузчике кодовой базы. Если попытка бросаетIllegalArgumentException, тогда этот метод бросает aClassNotFoundException.- если весь из не -
publicразрешенные интерфейсы определяются в том же самом загрузчике класса, тогда он пытается получить динамический прокси-класс для разрешенных интерфейсов, определенных в том загрузчике.- иначе, a
LinkageErrorбросается (потому что класс, который реализует все указанные интерфейсы, не может быть определен ни в каком загрузчике).Иначе, a
ClassNotFoundExceptionбросается для одного из именованных интерфейсов, которые не могли быть разрешены.
SecurityException - если есть менеджер безопасности и вызов checkPermission сбои метода@Deprecated public static Object getSecurityContext(ClassLoader loader)
loader - загрузчик класса, от которого можно получить контекст защитыSecurityManager.getSecurityContext()
Для дальнейшей ссылки API и документации разработчика, см. . Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.