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