Spec-Zone .ru
спецификации, руководства, описания, API
|
public abstract class ClassLoader extends Object
Каждый Class
объект содержит a reference
к ClassLoader, который определил это.
Объекты Class для классов массива не создаются загрузчиками class, но создаются автоматически как требуется Средой выполнения Java. Загрузчик class для массива class, как возвращено Class.getClassLoader()
то же самое как загрузчик class для его типа элемента; если тип элемента является типом примитива, то у массива class нет никакого загрузчика class.
Приложения реализуют подклассы ClassLoader, чтобы расширить способ, которым виртуальная машина Java динамически загружает классы.
Загрузчики класса могут обычно использоваться менеджерами безопасности, чтобы указать на домены безопасности.
ClassLoader class использует модель делегации, чтобы искать классы и ресурсы. У каждого экземпляра ClassLoader есть связанный родительский загрузчик class. Когда требующийся найти class или ресурс, экземпляр ClassLoader делегирует поиск class или ресурса к его родительскому загрузчику class прежде, чем попытаться найти class или ресурс непосредственно. Встроенный загрузчик class виртуальной машины, названный "начальной загрузкой загрузчик class", самостоятельно не имеет родителя, но может служить родителем экземпляра ClassLoader.
Загрузчики класса, которые поддерживают параллельную загрузку классов, известны как параллельные способные загрузчики class и обязаны регистрировать себя в свое время инициализации class, вызывая ClassLoader.registerAsParallelCapable
метод. Отметьте, что ClassLoader class регистрируется как параллель, способная по умолчанию. Однако, его подклассы все еще должны зарегистрировать себя, если они параллельны способный.
В средах, в которых модель делегации не является строго иерархической, загрузчики class должны быть параллельны способный, иначе загрузка class может привести к мертвым блокировкам, потому что блокировка загрузчика сохранена для продолжительности процесса загрузки class (см. loadClass
методы).
Обычно, виртуальная машина Java загружает классы из локальной файловой системы зависимым от платформы способом. Например, на системах UNIX, виртуальная машина загружает классы из каталога, определенного переменной окружения CLASSPATH.
Однако, некоторые классы, возможно, не происходят из файла; они могут произойти из других источников, таких как сеть, или они могли быть созданы приложением. Метод defineClass
преобразовывает массив байтов в экземпляр class Class. Экземпляры этого недавно определенного class могут быть созданы, используя Class.newInstance
.
Методы и конструкторы объектов, создаваемых загрузчиком class, могут сослаться на другие классы. Чтобы определить упомянутый class, виртуальная машина Java вызывает loadClass
метод загрузчика class, который первоначально создал class.
Например, приложение могло создать сетевой загрузчик class, чтобы загрузить файлы class с сервера. Пример кода мог бы быть похожим:
ClassLoader loader = new NetworkClassLoader(host, port); Object main = loader.loadClass("Main", true).newInstance(); . . .
Сетевой подкласс загрузчика class должен определить методы findClass
и loadClassData, чтобы загрузить class из сети. Как только это загрузило байты, которые составляют class, это должно использовать метод defineClass
создать экземпляр class. Демонстрационная реализация:
class NetworkClassLoader extends ClassLoader { String host; int port; public Class findClass(String name) { byte[] b = loadClassData(name); return defineClass(name, b, 0, b.length); } private byte[] loadClassData(String name) { // load the class data from the connection . . . } }
Любое имя class, обеспеченное как a String
параметр к методам в ClassLoader должен быть двоичным именем как определено Спецификацией языка Java™.
Примеры допустимых имен class включают:
"java.lang.String" "javax.swing.JSpinner$DefaultEditor" "java.security.KeyStore$Builder$FileBuilder$1" "java.net.URLClassLoader$3$1"
resolveClass(Class)
Модификатор | Конструктор и Описание |
---|---|
protected |
ClassLoader()
Создает новый загрузчик class, используя ClassLoader, возвращенный методом
getSystemClassLoader() как родительский загрузчик class. |
protected |
ClassLoader(ClassLoader parent)
Создает новый загрузчик class, используя указанный родительский загрузчик class для делегации.
|
Модификатор и Тип | Метод и Описание |
---|---|
void |
clearAssertionStatus()
Устанавливает состояние утверждения значения по умолчанию для этого загрузчика class к false и отбрасывает любые значения по умолчанию пакета или настройки состояния утверждения class, связанные с загрузчиком class.
|
protected Class<?> |
defineClass(byte[] b, int off, int len)
Осуждаемый.
Замененный
defineClass(String, byte[], int, int) |
protected Class<?> |
defineClass(String name, byte[] b, int off, int len)
Преобразовывает массив байтов в экземпляр class Class.
|
protected Class<?> |
defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain)
Преобразовывает массив байтов в экземпляр class Class, с дополнительным ProtectionDomain.
|
protected Class<?> |
defineClass(String name, ByteBuffer b, ProtectionDomain protectionDomain)
Преобразовывает a
ByteBuffer в экземпляр class Class, с дополнительным ProtectionDomain. |
protected Package |
definePackage(String name, String specTitle, String specVersion, String specVendor, String implTitle, String implVersion, String implVendor, URL sealBase)
Определяет пакет по имени в этом ClassLoader.
|
protected Class<?> |
findClass(String name)
Находит class с указанным двоичным именем.
|
protected String |
findLibrary(String libname)
Возвращает абсолютный путь собственной библиотеки.
|
protected Class<?> |
findLoadedClass(String name)
Возвращает class с данным двоичным именем, если этот загрузчик был записан виртуальной машиной Java как загрузчик инициирования class с тем двоичным именем.
|
protected URL |
findResource(String name)
Находит ресурс с именем.
|
protected Enumeration<URL> |
findResources(String name)
Возвращает перечисление
URL объекты, представляющие все ресурсы с именем. |
protected Class<?> |
findSystemClass(String name)
Находит class с указанным двоичным именем, загружая это в случае необходимости.
|
protected Object |
getClassLoadingLock(String className)
Возвращает объект блокировки для операций загрузки class.
|
protected Package |
getPackage(String name)
Возвращает Package, который был определен этим загрузчиком class или любым из его предков.
|
protected Package[] |
getPackages()
Возвраты весь Packages, определенный этим загрузчиком class и его предками.
|
ClassLoder |
getParent()
Возвращает родительский загрузчик class для делегации.
|
URL |
getResource(String name)
Находит ресурс с именем.
|
InputStream |
getResourceAsStream(String name)
Возвращает входной поток для того, чтобы считать указанный ресурс.
|
Enumeration<URL> |
getResources(String name)
Находит все ресурсы с именем.
|
static ClassLoader |
getSystemClassLoader()
Возвращает систему загрузчик class для делегации.
|
static URL |
getSystemResource(String name)
Сочтите ресурс указанного имени от пути поиска используемым, чтобы загрузить классы.
|
static InputStream |
getSystemResourceAsStream(String name)
Открытый для того, чтобы читать, ресурс указанного имени от пути поиска, используемого, чтобы загрузить классы.
|
static Enumeration<URL> |
getSystemResources(String name)
Считает все ресурсы указанного имени от пути поиска используемыми, чтобы загрузить классы.
|
Class<?> |
loadClass(String name)
Загружает class указанным двоичным именем.
|
protected Class<?> |
loadClass(String name, boolean resolve)
Загружает class указанным двоичным именем.
|
protected static boolean |
registerAsParallelCapable()
Регистрирует вызывающую сторону как способную параллель.
|
protected void |
resolveClass(Class<?> c)
Соединяет указанный class.
|
void |
setClassAssertionStatus(String className, boolean enabled)
Устанавливает требуемое состояние утверждения для именованного верхнего уровня class в этом загрузчике class и любых вложенных классах, содержавших там.
|
void |
setDefaultAssertionStatus(boolean enabled)
Устанавливает состояние утверждения значения по умолчанию для этого загрузчика class.
|
void |
setPackageAssertionStatus(String packageName, boolean enabled)
Устанавливает состояние утверждения значения по умолчанию пакета для именованного пакета.
|
protected void |
setSigners(Class<?> c, Object[] signers)
Устанавливает подписывающие лица class.
|
protected ClassLoader(ClassLoader parent)
Если есть менеджер безопасности, checkCreateClassLoader
метод вызывается. Это может привести к исключению безопасности.
parent
- Родительский загрузчик classSecurityException
- Если менеджер безопасности существует, и его метод checkCreateClassLoader не позволяет создание нового загрузчика class.protected ClassLoader()
getSystemClassLoader()
как родительский загрузчик class. Если есть менеджер безопасности, checkCreateClassLoader
метод вызывается. Это может привести к исключению безопасности.
SecurityException
- Если менеджер безопасности существует, и его метод checkCreateClassLoader не позволяет создание нового загрузчика class.public Class<?> loadClass(String name) throws ClassNotFoundException
loadClass(String, boolean)
метод. Это вызывается виртуальной машиной Java, чтобы разрешить ссылки class. Вызов этого метода эквивалентен вызову loadClass(name, false)
. name
- Двоичное имя classClassNotFoundException
- Если class не был найденprotected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
Вызвать findLoadedClass(String)
проверять, был ли class уже загружен.
Вызовите loadClass
метод на родительском загрузчике class. Если родителем является null, загрузчик class, встроенный к виртуальной машине, используется, вместо этого.
Вызовите findClass(String)
метод, чтобы найти class.
Если class был найден, используя вышеупомянутые шаги, и флаг resolve является истиной, этот метод тогда вызовет resolveClass(Class)
метод на получающемся объекте Class.
Подклассы ClassLoader поощряются переопределить findClass(String)
, а не этот метод.
Если не переопределено, этот метод синхронизируется на результате getClassLoadingLock
метод во время всего процесса загрузки class.
name
- Двоичное имя classresolve
- Если true тогда разрешает classClassNotFoundException
- Если class не мог бы быть найденprotected Object getClassLoadingLock(String className)
className
- Имя будущим образом загруженного classNullPointerException
- Если регистрирующийся как способная параллель и className нульloadClass(String, boolean)
protected Class<?> findClass(String name) throws ClassNotFoundException
loadClass
метод после проверки родительского загрузчика class для требуемого class. Реализация по умолчанию бросает ClassNotFoundException. name
- Двоичное имя classClassNotFoundException
- Если class не мог бы быть найден@Deprecated protected final Class<?> defineClass(byte[] b, int off, int len) throws ClassFormatError
defineClass(String, byte[], int, int)
b
- Байты, которые составляют данные class. У байтов в позициях off через off+len-1 должен быть формат допустимого файла class как определено Спецификацией Виртуальной машины Java™.off
- Запуск смещается в b данных classlen
- Длина данных classClassFormatError
- Если данные не содержали допустимый classIndexOutOfBoundsException
- Если или off или len отрицательны, или если off+len больше чем b.length.SecurityException
- Если попытка предпринимается, чтобы добавить этот class к пакету, который содержит классы, которые были подписаны различным набором сертификатов чем этот class, или если попытка предпринимается, чтобы определить class в пакете с полностью определенным именем, которое запускается с"java.
".loadClass(String, boolean)
, resolveClass(Class)
protected final Class<?> defineClass(String name, byte[] b, int off, int len) throws ClassFormatError
Этот метод присваивает значение по умолчанию ProtectionDomain
к недавно определенному class. ProtectionDomain эффективно предоставляют тот же самый набор полномочий, возвращенных когда Policy.getPolicy().getPermissions(new CodeSource(null, null))
вызывается. Домен значения по умолчанию создается на первом вызове defineClass
, и снова использованный на последующих вызовах.
Чтобы присвоить определенный ProtectionDomain class, используйте defineClass
метод, который берет ProtectionDomain в качестве одного из его параметров.
name
- Ожидаемое двоичное имя class, или null, если не известныйb
- Байты, которые составляют данные class. У байтов в позициях off через off+len-1 должен быть формат допустимого файла class как определено Спецификацией Виртуальной машины Java™.off
- Запуск смещается в b данных classlen
- Длина данных classClassFormatError
- Если данные не содержали допустимый classIndexOutOfBoundsException
- Если или off или len отрицательны, или если off+len больше чем b.length.SecurityException
- Если попытка предпринимается, чтобы добавить этот class к пакету, который содержит классы, которые были подписаны различным набором сертификатов чем этот class (который без знака), или если name начинается "с java.".loadClass(String, boolean)
, resolveClass(Class)
, CodeSource
, SecureClassLoader
protected final Class<?> defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain) throws ClassFormatError
defineClass(String, byte[], int, int)
. Прежде, чем class может использоваться, он должен быть разрешен. Первый class, определенный в пакете, определяет точный набор сертификатов, которые должны содержать все последующие классы, определенные в том пакете. Набор сертификатов для class получается из CodeSource
в пределах ProtectionDomain class. Любые классы, добавленные к тому пакету, должны содержать тот же самый набор сертификатов, или SecurityException будет брошен. Отметьте, что, если name является null, эта проверка не выполняется. Следует всегда передавать на двоичное имя class, который Вы определяете так же как байты. Это гарантирует, что class, который Вы определяете, является действительно class, Вы думаете, что это.
Указанный name не может начаться "с java.", так как все классы в "пакетах java.* могут только быть определены начальной загрузкой загрузчик class. Если name не является null, это должно быть равно двоичному имени class, определенного байтовым массивом "b", иначе NoClassDefFoundError будет брошен.
name
- Ожидаемое двоичное имя class, или null, если не известныйb
- Байты, которые составляют данные class. У байтов в позициях off через off+len-1 должен быть формат допустимого файла class как определено Спецификацией Виртуальной машины Java™.off
- Запуск смещается в b данных classlen
- Длина данных classprotectionDomain
- ProtectionDomain classClassFormatError
- Если данные не содержали допустимый classNoClassDefFoundError
- Если name не равен двоичному имени class, определенного bIndexOutOfBoundsException
- Если или off или len отрицательны, или если off+len больше чем b.length.SecurityException
- Если попытка предпринимается, чтобы добавить этот class к пакету, который содержит классы, которые были подписаны различным набором сертификатов чем этот class, или если name начинается "с java.".protected final Class<?> defineClass(String name, ByteBuffer b, ProtectionDomain protectionDomain) throws ClassFormatError
ByteBuffer
в экземпляр class Class, с дополнительным ProtectionDomain. Если доменом будет null, то домен значения по умолчанию будет присвоен class как определено в документации для defineClass(String, byte[], int, int)
. Прежде, чем class может использоваться, он должен быть разрешен. Правила о первом class, определенном в пакете, определяющем набор сертификатов для пакета, и ограничения на имена class, идентичны определенным в документации для defineClass(String, byte[], int, int, ProtectionDomain)
.
Вызов этого метода формы cl.defineClass(name, bBuffer, pd) приводит точно к тому же самому результату как операторы
...
byte[] temp = new byte[ bBuffer.remaining
()];
bBuffer.get
(временный файл);
возвратитьсяcl.defineClass( name, temp, 0, temp.length, pd);
name
- Ожидаемое двоичное имя. из class, или null, если не известныйb
- Байты, которые составляют данные class. У байтов от позиций b.position() через b.position() + b.limit() -1 должен быть формат допустимого файла class как определено Спецификацией Виртуальной машины Java™.protectionDomain
- ProtectionDomain class, или null.ClassFormatError
- Если данные не содержали допустимый class.NoClassDefFoundError
- Если name не равен двоичному имени class, определенного bSecurityException
- Если попытка предпринимается, чтобы добавить этот class к пакету, который содержит классы, которые были подписаны различным набором сертификатов чем этот class, или если name начинается "с java.".defineClass(String, byte[], int, int, ProtectionDomain)
protected final void resolveClass(Class<?> c)
c
- class, чтобы соединитьсяNullPointerException
- Если c является null.defineClass(String, byte[], int, int)
protected final Class<?> findSystemClass(String name) throws ClassNotFoundException
Этот метод загружает class через систему загрузчик class (см. getSystemClassLoader()
). У возвращенного объекта Class мог бы быть больше чем один ClassLoader, связанный с этим. Подклассы ClassLoader не должны обычно вызывать этот метод, потому что большинство загрузчиков class должно переопределить только findClass(String)
.
name
- Двоичное имя classClassNotFoundException
- Если class не мог бы быть найденClassLoader(ClassLoader)
, getParent()
protected final Class<?> findLoadedClass(String name)
name
- Двоичное имя classprotected final void setSigners(Class<?> c, Object[] signers)
c
- Объект Classsigners
- Подписывающие лица для classpublic URL getResource(String name)
Именем ресурса является '/ '-separated путь, который идентифицирует ресурс.
Этот метод будет сначала искать родительский загрузчик class ресурс; если родителем является null, путь загрузчика class, встроенного к виртуальной машине, ищется. Тот сбой, этот метод вызовет findResource(String)
найти ресурс.
name
- Имя ресурсаpublic Enumeration<URL> getResources(String name) throws IOException
Именем ресурса является / - разделенный путь, который идентифицирует ресурс.
Порядок поиска описывается в документации для getResource(String)
.
name
- Имя ресурсаURL
объекты для ресурса. Если никакие ресурсы не могли бы быть найдены, перечисление будет пусто. Ресурсы, к которым у загрузчика class нет доступа, не будут в перечислении.IOException
- Если ошибки ввода-вывода происходятfindResources(String)
protected URL findResource(String name)
name
- Имя ресурсаprotected Enumeration<URL> findResources(String name) throws IOException
URL
объекты, представляющие все ресурсы с именем. Реализации загрузчика класса должны переопределить этот метод, чтобы определить, где загрузить ресурсы из. name
- Имя ресурсаURL
объекты для ресурсовIOException
- Если ошибки ввода-вывода происходятprotected static boolean registerAsParallelCapable()
public static URL getSystemResource(String name)
getSystemClassLoader()
). name
- Имя ресурсаURL
объект для того, чтобы считать ресурс, или null, если ресурс не мог бы быть найденpublic static Enumeration<URL> getSystemResources(String name) throws IOException
Enumeration
из URL
объекты. Порядок поиска описывается в документации для getSystemResource(String)
.
name
- Имя ресурсаURL
объектыIOException
- Если ошибки ввода-вывода происходятpublic InputStream getResourceAsStream(String name)
Порядок поиска описывается в документации для getResource(String)
.
name
- Имя ресурсаpublic static InputStream getSystemResourceAsStream(String name)
getSystemClassLoader()
). name
- Имя ресурсаpublic final ClassLoader getParent()
Если менеджер безопасности присутствует, и загрузчик class invoker не является null и не является предком этого загрузчика class, то этот метод вызывает менеджера безопасности checkPermission
метод с a RuntimePermission("getClassLoader")
разрешение, чтобы проверить доступ к родительскому загрузчику class разрешается. В противном случае SecurityException будет брошен.
SecurityException
- Если менеджер безопасности существует, и его метод checkPermission не предоставляет доступ к родительскому загрузчику class загрузчика этого class.public static ClassLoader getSystemClassLoader()
Этот метод сначала вызывается рано в последовательности запуска времени выполнения, в которой точке он создает систему загрузчик class и устанавливает это как контекст загрузчик class вызова Thread.
Система значения по умолчанию загрузчик class является зависящим от реализации экземпляром этого class.
Если системное свойство "java.system.class.loader" определяется, когда этот метод сначала вызывается тогда, значение того свойства принимается, чтобы быть именем class, который будет возвращен как система загрузчик class. class загружается, используя систему значения по умолчанию загрузчик class и должен определить общедоступного конструктора, который берет единственный параметр типа ClassLoader, который используется в качестве родителя делегации. Экземпляр тогда создается, используя этого конструктора с системой значения по умолчанию загрузчик class как параметр. Получающийся загрузчик class определяется, чтобы быть системой загрузчик class.
Если менеджер безопасности присутствует, и загрузчиком class invoker не является null, и загрузчик class invoker не является тем же самым как или предок системы загрузчик class, то этот метод вызывает менеджера безопасности checkPermission
метод с a RuntimePermission("getClassLoader")
разрешение, чтобы проверить доступ к системе загрузчик class. В противном случае SecurityException будет брошен.
SecurityException
- Если менеджер безопасности существует, и его метод checkPermission не предоставляет доступ к системе загрузчик class.IllegalStateException
- Если вызвано рекурсивно во время конструкции class загрузчик определяется свойством "java.system.class.loader".Error
- Если системное свойство "java.system.class.loader" определяется, но именованный class не мог бы быть загружен, провайдер, class не определяет необходимого конструктора, или исключение выдается тем конструктором, когда это вызывается. Первопричина ошибки может быть получена через Throwable.getCause()
метод.protected Package definePackage(String name, String specTitle, String specVersion, String specVendor, String implTitle, String implVersion, String implVendor, URL sealBase) throws IllegalArgumentException
name
- Имя пакетаspecTitle
- Спецификация titlespecVersion
- Версия спецификацииspecVendor
- Поставщик спецификацииimplTitle
- Реализация titleimplVersion
- Версия реализацииimplVendor
- Поставщик реализацииsealBase
- Если не null, то этот пакет изолируется относительно данного источника кода URL
объект. Иначе, пакет не изолируется.IllegalArgumentException
- Если имя пакета копирует существующий пакет или в этом загрузчике class или в одном из его предковprotected Package getPackage(String name)
name
- Имя пакетаprotected Package[] getPackages()
protected String findLibrary(String libname)
libname
- Имя библиотекиSystem.loadLibrary(String)
, System.mapLibraryName(String)
public void setDefaultAssertionStatus(boolean enabled)
setPackageAssertionStatus(String, boolean)
или setClassAssertionStatus(String, boolean)
. enabled
- true, если классам, загруженным этим загрузчиком class, впредь включат утверждениям по умолчанию, false, если им отключат утверждения по умолчанию.public void setPackageAssertionStatus(String packageName, boolean enabled)
Подпакет пакета, названного p, является любым пакетом, имя которого начинается "с p.". Например, javax.swing.text является подпакетом javax.swing, и и java.util и java.lang.reflect являются подпакетами java.
Когда многократные значения по умолчанию пакета применяются к данному class, значение по умолчанию пакета, имеющее отношение к самому определенному пакету, имеет приоритет по другим. Например, если javax.lang и javax.lang.reflect оба связали значения по умолчанию пакета с ними, последнее значение по умолчанию пакета применяется к классам в javax.lang.reflect.
Значения по умолчанию пакета имеют приоритет по состоянию утверждения значения по умолчанию загрузчика class, и могут быть переопределены на на - class основание, вызывая setClassAssertionStatus(String, boolean)
.
packageName
- Имя пакета, состояние утверждения значения по умолчанию пакета которого должно быть установлено. Значение null указывает на неназванный пакет, который является "текущим" (см. раздел 7.4.2 из Спецификации языка Java™.)enabled
- true, если классам, загруженным этим classloader и принадлежащий именованному пакету или какому-либо из его подпакетов, включат утверждениям по умолчанию, false, если им отключат утверждения по умолчанию.public void setClassAssertionStatus(String className, boolean enabled)
Если именованный class не будет верхним уровнем class, то этот вызов не будет иметь никакого эффекта на фактическое состояние утверждения любого class.
className
- Полностью определенное имя class верхнего уровня class, состояние утверждения которого должно быть установлено.enabled
- true, если именованному class нужно было включить утверждениям, когда (и если) это инициализируется, false, если class нужно было отключить утверждения.public void clearAssertionStatus()
Для дальнейшей ссылки API и документации разработчика, см. Java Документация SE. Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2013, Oracle и/или его филиалы. Все права защищены.
Проект сборка-b92