Класс ClassLoader
- Direct Known Subclasses:
SecureClassLoader
public abstract class ClassLoader extends Object
ClassLoader является абстрактным классом. Учитывая бинарное имя класса, загрузчик класса должен попытаться найти или сгенерировать данные, которые составляют определение класса. Типичная стратегия заключается в преобразовании имени в имя файла и затем чтении "файла класса" с таким именем из файловой системы. Каждый объект Class содержит ссылку на reference загрузчик класса, который определил его.
Объекты для массивов классов не создаются загрузчиками классов, а создаются автоматически по мере необходимости в среде выполнения Java. Загрузчик класса для массива класса, возвращаемый методом Class.getClassLoader(), совпадает с загрузчиком класса для его типа элементов; если тип элемента является примитивным типом, то у массива класса нет загрузчика класса.
Приложения реализуют подклассы ClassLoader для расширения способа динамической загрузки классов виртуальной машиной Java.
Загрузчики классов могут обычно использоваться менеджерами безопасности для указания областей безопасности.
Помимо загрузки классов, загрузчик классов также отвечает за поиск ресурсов. Ресурс — это какие-либо данные (например, файл ".class", данные конфигурации или изображение), которые идентифицируются с помощью абстрактного имени пути, разделяемого символом '/'. Ресурсы обычно упаковываются с приложением или библиотекой, чтобы код в приложении или библиотеке мог их найти. В некоторых случаях ресурсы включаются для того, чтобы их могли найти другие библиотеки.
Класс ClassLoader использует модель делегирования для поиска классов и ресурсов. У каждого экземпляра ClassLoader есть ассоциированный родительский загрузчик класса. Когда требуется найти класс или ресурс, экземпляр ClassLoader обычно делегирует поиск класса или ресурса своему родительскому загрузчику класса, прежде чем попытаться найти класс или ресурс самостоятельно.
Загрузчики классов, поддерживающие одновременную загрузку классов, известны как загрузчики классов, поддерживающие параллельную загрузку, и должны зарегистрировать себя во время инициализации класса, вызвав метод ClassLoader.registerAsParallelCapable. Обратите внимание, что класс ClassLoader по умолчанию зарегистрирован как поддерживающий параллельную загрузку. Однако его подклассы по-прежнему должны зарегистрировать себя, если они поддерживают параллельную загрузку. В средах, в которых модель делегирования не строго иерархична, загрузчики классов должны поддерживать параллельную загрузку, в противном случае загрузка класса может привести к тупиковой ситуации, потому что блокировка загрузчика удерживается на время процесса загрузки класса (см. методы loadClass).
Встроенные загрузчики классов во время выполнения
Среда выполнения Java имеет следующие встроенные загрузчики классов:Загрузчик базового класса. Это встроенный загрузчик класса виртуальной машины, обычно представленный как
null, и у него нет родителя.-
Загрузчик платформенного класса. Загрузчик платформенного класса отвечает за загрузку платформенных классов. Плаформа класса включает API платформы Java SE, их реализующие классы и специфичные для JDK классы среды выполнения, которые определены загрузчиком платформенного класса или его предками. Загрузчик платформенного класса может использоваться в качестве родителя экземпляра
ClassLoader.Чтобы обеспечить возможность обновления/переопределения модулей, определенных для загрузчика платформенного класса, и где обновленные модули считывают модули, определенные для загрузчиков классов, отличных от загрузчика платформенного класса и его предков, загрузчик платформенного класса может потребоваться делегировать другим загрузчикам классов, например, загрузчику приложения. Другими словами, классы в именованных модулях, определенных для загрузчиков классов, отличных от загрузчика платформенного класса и его предков, могут быть видимыми для загрузчика платформенного класса.
Загрузчик системного класса. Он также известен как загрузчик приложения и отличается от загрузчика платформенного класса. Загрузчик системного класса обычно используется для определения классов в пути приложения, пути модулей и специфических для JDK инструментов. Загрузчик платформенного класса является родителем или предком загрузчика системного класса, поэтому загрузчик системного класса может загружать платформенные классы, делегируя своему родителю.
Обычно виртуальная машина Java загружает классы из локальной файловой системы в зависимости от платформы. Однако некоторые классы могут не происходить из файла; они могут происходить из других источников, таких как сеть, или они могут быть созданы приложением. Метод 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
. . .
}
}
Бинарные имена
Любое имя класса, предоставляемое в качестве параметра String методам в ClassLoader, должно быть бинарным именем, как определено в Спецификации языка Java.
Примеры допустимых имен классов:
"java.lang.String" "javax.swing.JSpinner$DefaultEditor" "java.security.KeyStore$Builder$FileBuilder$1" "java.net.URLClassLoader$3$1"
Любое имя пакета, предоставляемое в качестве параметра String методам в ClassLoader, должно быть либо пустой строкой (обозначающей безымянный пакет), либо полным именем, как определено в Спецификации языка Java.
- См. Спецификацию языка Java:
- 6.7 Полные имена
13.1 Форма бинарного файла
- С:
- 1.0
- См. также:
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Создаёт новый загрузчик классов, используя ClassLoader возвращённый методом getSystemClassLoader() в качестве родительского загрузчика классов. |
|
protected |
Создаёт новый загрузчик классов, используя указанный родительский загрузчик классов для делегирования. |
|
protected |
Создаёт новый загрузчик классов с указанным именем и используя указанный родительский загрузчик классов для делегирования. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
clearAssertionStatus() |
Устанавливает состояние утверждений по умолчанию для этого загрузчика классов в false и отбрасывает любые настройки по умолчанию пакетов или состояния утверждений класса, связанные с загрузчиком классов. |
protected final Class |
defineClass |
Устаревший. |
protected final Class |
defineClass |
Преобразует массив байтов в экземпляр класса Class. |
protected final Class |
defineClass |
Преобразует массив байтов в экземпляр класса Class, с заданным ProtectionDomain. |
protected final Class |
defineClass |
|
protected Package |
definePackage |
Определяет пакет по имени в этом ClassLoader. |
protected Class |
findClass |
Ищет класс с указанным бинарным именем. |
protected Class |
findClass |
Ищет класс с заданным бинарным именем в модуле, определённом для этого загрузчика классов. |
protected String |
findLibrary |
Возвращает абсолютный путь к нативной библиотеке. |
protected final Class |
findLoadedClass |
Возвращает класс с заданным бинарным именем, если этот загрузчик был записан виртуальной машиной Java как инициатор загрузки класса с этим бинарным именем. |
protected URL |
findResource |
Ищет ресурс с заданным именем. |
protected URL |
findResource |
Возвращает URL к ресурсу в модуле, определённом для этого загрузчика классов. |
protected Enumeration |
findResources |
Возвращает перечисление объектов URL, представляющих все ресурсы с заданным именем. |
protected final Class |
findSystemClass |
Ищет класс с указанным бинарным именем, загружая его при необходимости. |
protected Object |
getClassLoadingLock |
Возвращает объект блокировки для операций загрузки классов. |
final Package |
getDefinedPackage |
Возвращает Package заданного имени, определённого этим загрузчиком классов. |
final Package[] |
getDefinedPackages() |
Возвращает все Package определённые этим загрузчиком классов. |
String |
getName() |
Возвращает имя этого загрузчика классов или null если этот загрузчик классов не имеет имени. |
protected Package |
getPackage |
Устаревший. Если несколько загрузчиков классов делегируют друг другу и определяют классы с одинаковым именем пакета, и один из таких загрузчиков полагается на поведение поиска getPackage для возвращения Package от родительского загрузчика, то свойства, доступные через Package, могут не соответствовать ожиданиям в остальной части программы. |
protected Package[] |
getPackages() |
Возвращает все Package определённые этим загрузчиком классов и его предками. |
final ClassLoader |
getParent() |
Возвращает родительский загрузчик классов для делегирования. |
static ClassLoader |
getPlatformClassLoader() |
Возвращает загрузчик платформенных классов. |
URL |
getResource |
Ищет ресурс с заданным именем. |
InputStream |
getResourceAsStream |
Возвращает поток для чтения указанного ресурса. |
Enumeration |
getResources |
Ищет все ресурсы с заданным именем. |
static ClassLoader |
getSystemClassLoader() |
Возвращает системный загрузчик классов. |
static URL |
getSystemResource |
Находит ресурс с заданным именем из пути поиска, используемого для загрузки классов. |
static InputStream |
getSystemResourceAsStream |
Открыть для чтения ресурс с указанным именем из пути поиска, используемого для загрузки классов. |
static Enumeration |
getSystemResources |
Находит все ресурсы с указанным именем из пути поиска, используемого для загрузки классов. |
final Module |
getUnnamedModule() |
Возвращает безымянный Module для этого загрузчика классов. |
final boolean |
isRegisteredAsParallelCapable() |
Возвращает true если этот загрузчик классов зарегистрирован как параллельно-способный, в противном случае false. |
Class |
loadClass |
Загружает класс с указанным бинарным именем. |
protected Class |
loadClass |
Загружает класс с указанным бинарным именем. |
protected static boolean |
registerAsParallelCapable() |
Регистрирует вызывающего как параллельно-способный. |
protected final void |
resolveClass |
Связывает указанный класс. |
Stream |
resources |
Возвращает поток, элементы которого являются URL всех ресурсов с заданным именем. |
void |
setClassAssertionStatus |
Устанавливает желаемое состояние утверждений для верхнего уровня класса с именем в этом загрузчике классов и любых вложенных классов, содержащихся в нём. |
void |
setDefaultAssertionStatus |
Устанавливает состояние утверждений по умолчанию для этого загрузчика классов. |
void |
setPackageAssertionStatus |
Устанавливает состояние утверждений по умолчанию для пакета с указанным именем. |
protected final void |
setSigners |
Устанавливает подписи класса. |
Подробное описание конструкторов
ClassLoader
protected ClassLoader(String name, ClassLoader parent)
- Примечание API:
- Если родительский загрузчик указан как
null(для загрузчика базовых классов), то нет гарантии, что все платформенные классы будут видны. - Параметры:
-
name- имя загрузчика классов; илиnullесли имя не указано -
parent- родительский загрузчик классов - Исключения:
-
IllegalArgumentException- если заданное имя пустое. -
SecurityException- если менеджер безопасности существует и его методSecurityManager.checkCreateClassLoader()не разрешает создание нового загрузчика классов. - С:
- 9
ClassLoader
protected ClassLoader(ClassLoader parent)
Если менеджер безопасности существует, вызывается его метод checkCreateClassLoader. Это может привести к исключению безопасности.
- Примечание API:
- Если родительский загрузчик указан как
null(для загрузчика базовых классов), то нет гарантии, что все платформенные классы будут видны. - Параметры:
-
parent- Родительский загрузчик классов - Исключения:
-
SecurityException- Если менеджер безопасности существует и егоcheckCreateClassLoaderметод не разрешает создание нового загрузчика классов. - С:
- 1.2
ClassLoader
protected ClassLoader()
ClassLoader системных классов, возвращаемый методом getSystemClassLoader(), в качестве родительского загрузчика классов. Если менеджер безопасности существует, вызывается его метод checkCreateClassLoader. Это может привести к исключению безопасности.
- Исключения:
-
SecurityException- Если менеджер безопасности существует и егоcheckCreateClassLoaderметод не разрешает создание нового загрузчика классов.
Подробное описание методов
getName
public String getName()
null если этот загрузчик классов не имеет имени.- Примечание API:
- Этот метод не является final для совместимости. Если этот метод переопределён, этот метод должен возвращать то же самое имя, что и при создании этого загрузчика классов.
- Возвращает:
- Имя этого загрузчика классов; или
nullесли этот загрузчик классов не имеет имени. - С:
- 9
loadClass
public Class<?> loadClass(String name) throws ClassNotFoundException
loadClass(String, boolean). Он вызывается виртуальной машиной Java для разрешения ссылок на классы. Вызов этого метода эквивалентен вызову loadClass(name,
false).- Параметры:
-
name- Бинарное имя класса - Возвращает:
- Полученный
Classобъект - Исключения:
-
ClassNotFoundException- Если класс не был найден
loadClass
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
Вызов
findLoadedClass(String)для проверки, был ли класс уже загружен.Вызов метода
loadClassу родительского загрузчика классов. Если родительский загрузчикnullиспользуется встроенный в виртуальную машину загрузчик классов.Вызов метода
findClass(String)для поиска класса.
Если класс был найден с помощью вышеуказанных шагов, и флаг resolve имеет значение true, этот метод затем вызовет метод resolveClass(Class) над полученным Class объектом.
Подклассам ClassLoader рекомендуется переопределить findClass(String), а не этот метод.
Если не переопределён, этот метод синхронизируется на результате метода getClassLoadingLock на протяжении всего процесса загрузки класса.
- Параметры:
-
name- Бинарное имя класса -
resolve- Еслиtrueразрешить разрешение класса - Возвращает:
- Полученный
Classобъект - Исключения:
-
ClassNotFoundException- Если класс не может быть найден
getClassLoadingLock
protected Object getClassLoadingLock(String className)
- Примечание API:
- Этот метод позволяет загрузчикам классов, поддерживающим параллельность, реализовывать более точные схемы блокировки, чтобы несколько потоков могли загружать классы одновременно без тупиков. Для загрузчиков классов, не поддерживающих параллельность, объект
ClassLoaderсинхронизируется на протяжении операций загрузки класса. Загрузчики классов с неиерархическим делегированием должны быть зарегистрированы как поддерживающие параллельность для предотвращения тупиков. - Требования к реализации:
- Если этот объект
ClassLoaderзарегистрирован как поддерживающий параллельность, этот метод возвращает выделенный объект, связанный с указанным именем класса. В противном случае этот метод возвращает этот объектClassLoader. - Параметры:
-
className- Имя класса, который нужно загрузить - Возвращает:
- Блокировка для операций загрузки класса
- Исключения:
-
NullPointerException- Если зарегистрирован как поддерживающий параллельность иclassNameявляетсяnull. - С:
- 1.7
- См. также:
findClass
protected Class<?> findClass(String name) throws ClassNotFoundException
loadClass после проверки родительского загрузчика классов на запрашиваемый класс.- Требования к реализации:
- Стандартная реализация выбрасывает
ClassNotFoundException. - Параметры:
-
name- Бинарное имя класса - Возвращает:
- Полученный
Classобъект - Исключения:
-
ClassNotFoundException- Если класс не может быть найден - С:
- 1.2
findClass
protected Class<?> findClass(String moduleName, String name)
- Примечание API:
- Этот метод возвращает
nullвместо выбрасыванияClassNotFoundExceptionесли класс не был найден. - Требования к реализации:
- Стандартная реализация пытается найти класс, вызывая
findClass(String)когдаmoduleNameявляетсяnull. В противном случае возвращаетnull. - Параметры:
-
moduleName- имя модуля; илиnullдля поиска класса в безымянном модуле для этого загрузчика классов -
name- Бинарное имя класса - Возвращает:
- Полученный
Classобъект илиnullесли класс не был найден. - С:
- 9
defineClass
@Deprecated(since="1.1") protected final Class<?> defineClass(byte[] b, int off, int len) throws ClassFormatError
defineClass(String, byte[], int, int)
Class. Перед использованием Class необходимо его разрешить. Этот метод устарел в пользу версии, которая принимает бинарное имя в качестве первого аргумента и более безопасен.- Параметры:
-
b- Байты, составляющие данные класса. Байты в позицияхoffпоoff+len-1должны иметь формат допустимого файла класса, как определено в Спецификации виртуальной машины Java. -
off- Начальный смещение вbданных класса -
len- Длина данных класса - Возвращает:
- Объект
Class, созданный из указанных данных класса - Исключения:
-
ClassFormatError- Если данные не содержали допустимый класс -
IndexOutOfBoundsException- Если либоoffилиlenотрицательные, или еслиoff+lenбольше, чемb.length. -
SecurityException- Если предпринята попытка добавить этот класс в пакет, содержащий классы, подписанные набором сертификатов, отличным от этого класса, или если предпринята попытка определить класс в пакете с полным именем, начинающимся с "java.". - См. также:
defineClass
protected final Class<?> defineClass(String name, byte[] b, int off, int len) throws ClassFormatError
Class. Перед использованием Class необходимо его разрешить. Этот метод назначает по умолчанию ProtectionDomain вновь определённому классу. ProtectionDomain фактически предоставляется тот же набор разрешений, что и при вызове Policy.getPolicy().getPermissions(new CodeSource(null, null)). Домен защиты по умолчанию создаётся при первом вызове defineClass и повторно используется при последующих вызовах.
Чтобы назначить определённый ProtectionDomain классу, используйте метод defineClass, принимающий ProtectionDomain в качестве одного из аргументов.
Этот метод определяет пакет в этом загрузчике классов, соответствующий пакету Class (если такой пакет ещё не определён в этом загрузчике классов). Имя определённого пакета получено из имени бинарного файла класса, указанного массивом байтов b. Другие свойства определённого пакета указаны в Package.
- Parameters:
-
name- Ожидаемое имя бинарного файла класса илиnull, если оно неизвестно -
b- Байты, составляющие данные класса. Байты в позицияхoffпоoff+len-1должны иметь формат допустимого файла класса, как определено в Спецификации виртуальной машины Java. -
off- Начальный смещение вbданных класса -
len- Длина данных класса - Returns:
- Объект
Class, созданный из указанных данных класса. - Throws:
-
ClassFormatError- Если данные не содержат допустимый класс -
IndexOutOfBoundsException- Еслиoffилиlenотрицательны или еслиoff+lenбольшеb.length. -
SecurityException- Если попытка добавить этот класс в пакет, содержащий классы, подписанные другим набором сертификатов, чем этот класс (который не подписан), или еслиnameначинается с "java.". - Since:
- 1.1
- See Also:
defineClass
protected final Class<?> defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain) throws ClassFormatError
Class, с заданным ProtectionDomain. Если заданный ProtectionDomain равен null, то классу будет назначен домен защиты по умолчанию, как указано в документации для defineClass(String, byte[], int, int). Перед использованием класса необходимо его разрешить.
Первый определённый класс в пакете определяет точный набор сертификатов, которые должны содержать все последующие классы, определённые в этом пакете. Набор сертификатов для класса получен из CodeSource в ProtectionDomain класса. Любые добавленные классы в этот пакет должны содержать тот же набор сертификатов, иначе будет брошено исключение SecurityException. Обратите внимание, что если name равно null, эта проверка не выполняется. Вы всегда должны передавать бинарное имя класса, который вы определяете, а также байты. Это гарантирует, что класс, который вы определяете, действительно является тем классом, который вы предполагаете.
Если указанное name начинается с "java.", его может определить только загрузчик платформенных классов или его предки; в противном случае будет брошено исключение SecurityException. Если name не равно null, оно должно быть равно бинарному имени класса, заданному массивом байтов b, в противном случае будет брошено исключение NoClassDefFoundError.
Этот метод определяет пакет в этом загрузчике классов, соответствующий пакету Class (если такой пакет ещё не определён в этом загрузчике классов). Имя определённого пакета получено из имени бинарного файла класса, указанного массивом байтов b. Другие свойства определённого пакета указаны в Package.
- Parameters:
-
name- Ожидаемое бинарное имя класса илиnull, если оно неизвестно -
b- Байты, составляющие данные класса. Байты в позицияхoffпоoff+len-1должны иметь формат допустимого файла класса, как определено в Спецификации виртуальной машины Java. -
off- Начальный смещение вbданных класса -
len- Длина данных класса -
protectionDomain-ProtectionDomainкласса - Returns:
- Объект
Classсозданный из данных, иProtectionDomain. - Throws:
-
ClassFormatError- Если данные не содержат допустимый класс -
NoClassDefFoundError- Еслиnameне равноnullи не равно бинарному имени класса, указанногоb -
IndexOutOfBoundsException- Еслиoffилиlenотрицательны, или еслиoff+lenбольшеb.length. -
SecurityException- Если попытка добавить этот класс в пакет, содержащий классы, подписанные другим набором сертификатов, чем этот класс, или еслиnameначинается с "java.", а этот загрузчик классов не является загрузчиком платформенных классов или его предком.
defineClass
protected final Class<?> defineClass(String name, ByteBuffer b, ProtectionDomain protectionDomain) throws ClassFormatError
ByteBuffer в экземпляр класса Class, с заданным ProtectionDomain. Если заданный 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(temp);
return cl.defineClass(name, temp, 0,
temp.length, pd);
- Parameters:
-
name- Ожидаемое имя бинарного файла класса илиnull, если оно неизвестно -
b- Байты, составляющие данные класса. Байты с позицийb.position()поb.position() + b.limit() -1должны иметь формат допустимого файла класса, как определено в Спецификации виртуальной машины Java. -
protectionDomain-ProtectionDomainкласса илиnull. - Returns:
- Объект
Classсозданный из данных, иProtectionDomain. - Throws:
-
ClassFormatError- Если данные не содержат допустимый класс. -
NoClassDefFoundError- Еслиnameне равноnullи не равно бинарному имени класса, указанногоb -
SecurityException- Если попытка добавить этот класс в пакет, содержащий классы, подписанные другим набором сертификатов, чем этот класс, или еслиnameначинается с "java.". - Since:
- 1.5
- See Also:
resolveClass
protected final void resolveClass(Class<?> c)
c уже связан, то этот метод просто возвращает значение. В противном случае класс связывается, как описано в главе "Исполнение" в Спецификации языка Java.- Parameters:
-
c- Класс для связывания - Throws:
-
NullPointerException- Еслиcравноnull. - See Also:
findSystemClass
protected final Class<?> findSystemClass(String name) throws ClassNotFoundException
Этот метод загружает класс через системный загрузчик классов (см. getSystemClassLoader()). Возвращаемый объект Class может иметь более одного ClassLoader, связанного с ним. Подклассы ClassLoader обычно не должны вызывать этот метод, поскольку большинству загрузчиков классов нужно переопределять только findClass(String).
- Parameters:
-
name- Бинарное имя класса - Returns:
- Объект
Classдля указанногоname - Throws:
-
ClassNotFoundException- Если класс не был найден - See Also:
findLoadedClass
protected final Class<?> findLoadedClass(String name)
null.- Parameters:
-
name- Бинарное имя класса - Returns:
- Объект
Classилиnullесли класс не загружен - Since:
- 1.1
setSigners
protected final void setSigners(Class<?> c, Object[] signers)
- Parameters:
-
c- ОбъектClass -
signers- Подписи для класса - Since:
- 1.1
findResource
protected URL findResource(String moduleName, String name) throws IOException
- API Note:
- Этот метод является основой для методов
Class.getResource,Class.getResourceAsStreamиModule.getResourceAsStream. Он не подчиняется правилам инкапсуляции, определеннымModule.getResourceAsStream. - Implementation Requirements:
- Реализация по умолчанию пытается найти ресурс, вызвав
findResource(String), когдаmoduleNameравноnull. В противном случае возвращаетnull. - Parameters:
-
moduleName- Имя модуля; илиnullдля поиска ресурса в безымянном модуле для этого загрузчика классов -
name- Имя ресурса - Returns:
- URL ресурса;
nullесли ресурс не найден, URL не удалось создать для поиска ресурса, доступ к ресурсу запрещен менеджером безопасности, или модуль с заданным именем не определен для загрузчика классов. - Throws:
-
IOException- Если возникли ошибки ввода-вывода - Since:
- 9
- See Also:
getResource
public URL getResource(String name)
Имя ресурса — это имя пути, разделенное символом «/», которое идентифицирует ресурс.
Ресурсы в именованных модулях подчиняются правилам инкапсуляции, указанным в Module.getResourceAsStream. Кроме того, за исключением специального случая, когда имя ресурса оканчивается на ".class", этот метод будет находить ресурсы только в пакетах именованных модулей, когда пакет opened безусловно (даже если вызывающий этот метод находится в том же модуле, что и ресурс).
- API Note:
- В случае нескольких модулей, определённых для одного и того же загрузчика классов, и если более одного модуля содержит ресурс с заданным именем, то порядок поиска модулей не определён и может быть очень непредсказуемым. При переопределении этого метода рекомендуется, чтобы реализация обеспечивала согласованность любой делегации с методом
getResources(String). - Implementation Requirements:
- Реализация по умолчанию сначала ищет ресурс в родительском загрузчике классов; если родительский загрузчик является
null, ищется путь встроенного в виртуальную машину загрузчика классов. Если не найден, этот метод вызоветfindResource(String)для поиска ресурса. - Parameters:
-
name- Имя ресурса - Returns:
-
Объект
URLдля чтения ресурса;nullесли ресурс не найден,URLне удалось создать для поиска ресурса, ресурс находится в пакете, который не открыт безусловно, или доступ к ресурсу запрещён менеджером безопасности. - Throws:
-
NullPointerException- Еслиnameявляетсяnull - Since:
- 1.1
getResources
public Enumeration<URL> getResources(String name) throws IOException
Имя ресурса — это имя пути, разделенное символом «/», которое идентифицирует ресурс.
Ресурсы в именованных модулях подчиняются правилам инкапсуляции, указанным в Module.getResourceAsStream. Кроме того, за исключением специального случая, когда имя ресурса оканчивается на ".class", этот метод будет находить ресурсы только в пакетах именованных модулей, когда пакет opened безусловно (даже если вызывающий этот метод находится в том же модуле, что и ресурс).
- API Note:
- Если несколько модулей определены для одного загрузчика классов и более одного модуля содержит ресурс с данным именем, порядок не определён и может быть очень непредсказуемым. При переопределении этого метода рекомендуется, чтобы реализация обеспечивала согласованность любой делегации с методом
getResource(String). Это должно обеспечить, что первый элемент, возвращаемый методомnextElementобъекта перечисления, является тем же ресурсом, который возвратил бы методgetResource(String). - Implementation Requirements:
- Реализация по умолчанию сначала ищет ресурс в родительском загрузчике классов; если родительский загрузчик является
nullищется путь встроенного в виртуальную машину загрузчика классов. Затем он вызываетfindResources(String)для поиска ресурсов с заданным именем в этом загрузчике классов. Он возвращает перечисление, элементы которого являются URL, найденными при поиске в родительском загрузчике классов, за которым следуют элементы, найденные с помощьюfindResources. - Parameters:
-
name- Имя ресурса - Returns:
- Перечисление объектов
URLдля ресурса. Если ресурсы не найдены, перечисление будет пустым. Ресурсы, для которых невозможно создатьURL, находятся в пакете, который не открыт безусловно, или доступ к ресурсу запрещён менеджером безопасности, не возвращаются в перечислении. - Throws:
-
IOException- Если возникли ошибки ввода-вывода -
NullPointerException- Еслиnameявляетсяnull - Since:
- 1.2
ресурсы
public Stream<URL> resources(String name)
Имя ресурса — это путь с разделителями «/», который идентифицирует ресурс.
Ресурсы будут найдены при оценке возвращаемого потока. Если оценка приводит к IOException, то исключение I/O обернуто в UncheckedIOException, которое затем выбрасывается.
Ресурсы в именованных модулях подчиняются правилам инкапсуляции, указанным в Module.getResourceAsStream. Кроме того, за исключением специального случая, когда имя ресурса оканчивается на «.class», этот метод будет находить ресурсы только в пакетах именованных модулей, когда пакет opened безусловно (даже если вызывающий метод находится в том же модуле, что и ресурс).
- Примечание API:
- При переопределении этого метода рекомендуется, чтобы реализация гарантировала, что любая делегация согласуется с методом
getResource(String). Это должно обеспечить, что первый элемент, возвращаемый потоком, является тем же ресурсом, который вернул бы методgetResource(String). - Требования к реализации:
- В реализации по умолчанию вызывается
getResourcesдля поиска всех ресурсов с заданным именем и возвращается поток с элементами из перечисления в качестве источника. - Параметры:
-
name- Имя ресурса - Возвращает:
- Поток объектов ресурса
URL. Если ресурсы не найдены, поток будет пустым. Ресурсы, для которых нельзя создатьURL, находятся в пакете, который не открывается безусловно, или доступ к ресурсу запрещен менеджером безопасности, не будут в потоке. - Исключение:
-
NullPointerException- Еслиnameявляетсяnull - С:
- 9
найтиРесурс
protected URL findResource(String name)
Для ресурсов в именованных модулях метод должен реализовывать правила инкапсуляции, указанные в Module getResourceAsStream метод. Кроме того, он не должен находить ресурсы, не являющиеся «.class», в пакетах именованных модулей, если пакет не opened безусловно.
- Требования к реализации:
- В реализации по умолчанию возвращается
null. - Параметры:
-
name- Имя ресурса - Возвращает:
-
URLобъект для чтения ресурса;null, если ресурс не найден,URLне удалось создать для поиска ресурса, ресурс находится в пакете, который не открывается безусловно, или доступ к ресурсу запрещен менеджером безопасности. - С:
- 1.2
найтиРесурсы
protected Enumeration<URL> findResources(String name) throws IOException
URL, представляющих все ресурсы с заданным именем. Реализации загрузчика классов должны переопределять этот метод. Для ресурсов в именованных модулях метод должен реализовывать правила инкапсуляции, указанные в Module getResourceAsStream метод. Кроме того, он не должен находить ресурсы, не являющиеся «.class», в пакетах именованных модулей, если пакет не opened безусловно.
- Требования к реализации:
- В реализации по умолчанию возвращается перечисление, не содержащее элементов.
- Параметры:
-
name- Имя ресурса - Возвращает:
- Перечисление объектов
URLдля ресурса. Если ресурсы не найдены, перечисление будет пустым. Ресурсы, для которых нельзя создатьURL, находятся в пакете, который не открывается безусловно, или доступ к ресурсу запрещен менеджером безопасности, не возвращаются в перечислении. - Исключение:
-
IOException- Если произошли ошибки ввода-вывода - С:
- 1.2
зарегистрироватьКакПараллельноСпособный
protected static boolean registerAsParallelCapable()
- не создан ни один экземпляр вызывающего метода
- все суперклассы (кроме класса Object) вызывающего метода зарегистрированы как параллельно способные
Обратите внимание, что после регистрации загрузчика классов как параллельно способного, изменить это невозможно.
В случаях, когда этот метод вызывается из контекста, где вызывающий метод не является подклассом ClassLoader, или нет кадра вызова в стеке (например, при вызове непосредственно из прикрепленного к JNI потока), выбрасывается IllegalCallerException.
- Возвращает:
-
trueесли вызывающий метод успешно зарегистрирован как параллельно способный, иfalseв противном случае. - Исключение:
-
IllegalCallerException- если вызывающий метод не является подклассомClassLoader - С:
- 1.7
- См. также:
зарегистрированКакПараллельноСпособный
public final boolean isRegisteredAsParallelCapable()
- Возвращает:
-
trueесли этот загрузчик классов параллельно способный, иначеfalse. - С:
- 9
- См. также:
getSystemResource
public static URL getSystemResource(String name)
getSystemClassLoader()). Ресурсы в именованных модулях подчиняются правилам инкапсуляции, указанным в Module.getResourceAsStream. Кроме того, за исключением специального случая, когда имя ресурса оканчивается на «.class», этот метод будет находить ресурсы только в пакетах именованных модулей, когда пакет opened безусловно.
- Параметры:
-
name- Имя ресурса - Возвращает:
- Ссылка
URLна ресурс;nullесли ресурс не найден, URL не удалось создать для поиска ресурса, ресурс находится в пакете, который не открывается безусловно, или доступ к ресурсу запрещен менеджером безопасности. - С:
- 1.1
getSystemResources
public static Enumeration<URL> getSystemResources(String name) throws IOException
Enumeration объектов URL. Порядок поиска описан в документации к getSystemResource(String).
Ресурсы в именованных модулях подчиняются правилам инкапсуляции, указанным в Module.getResourceAsStream. Кроме того, за исключением специального случая, когда имя ресурса оканчивается на «.class», этот метод будет находить ресурсы только в пакетах именованных модулей, когда пакет opened безусловно.
- Параметры:
-
name- Имя ресурса - Возвращает:
- Перечисление объектов
URLдля ресурса. Если ресурсы не найдены, перечисление будет пустым. Ресурсы, для которых нельзя создатьURL, находятся в пакете, который не открывается безусловно, или доступ к ресурсу запрещен менеджером безопасности, не возвращаются в перечислении. - Исключение:
-
IOException- Если произошли ошибки ввода-вывода - С:
- 1.2
getResourceAsStream
public InputStream getResourceAsStream(String name)
Порядок поиска описан в документации к getResource(String).
Ресурсы в именованных модулях подчиняются правилам инкапсуляции, указанным в Module.getResourceAsStream. Кроме того, за исключением специального случая, когда имя ресурса оканчивается на «.class», этот метод будет находить ресурсы только в пакетах именованных модулей, когда пакет opened безусловно.
- Параметры:
-
name- Имя ресурса - Возвращает:
- Поток ввода для чтения ресурса;
nullесли ресурс не найден, ресурс находится в пакете, который не открывается безусловно, или доступ к ресурсу запрещен менеджером безопасности. - Исключение:
-
NullPointerException- Еслиnameявляетсяnull - С:
- 1.1
getSystemResourceAsStream
public static InputStream getSystemResourceAsStream(String name)
getSystemClassLoader()). Ресурсы в именованных модулях подчиняются правилам инкапсуляции, указанным в Module.getResourceAsStream. Кроме того, за исключением специального случая, когда имя ресурса оканчивается на ".class", этот метод будет находить ресурсы только в пакетах именованных модулей, когда пакет opened безусловно.
- Parameters:
-
name- Имя ресурса - Returns:
- Поток ввода для чтения ресурса;
nullесли ресурс не был найден, ресурс находится в пакете, который не открыт безусловно, или доступ к ресурсу запрещён менеджером безопасности. - Since:
- 1.1
getParent
public final ClassLoader getParent()
null для представления загрузчика базовых классов. Этот метод вернёт null в таких реализациях, если родительским загрузчиком класса является загрузчик базовых классов.- Returns:
- Родительский
ClassLoader - Throws:
-
SecurityException- Если присутствует менеджер безопасности, и загрузчик класса вызывающего метода неnullи не является предком этого загрузчика, и у вызывающего метода нетRuntimePermission("getClassLoader") - Since:
- 1.2
getUnnamedModule
public final Module getUnnamedModule()
Module для этого загрузчика классов.- Returns:
- Безымянный модуль для этого загрузчика классов
- Since:
- 9
- See Also:
getPlatformClassLoader
public static ClassLoader getPlatformClassLoader()
- Implementation Note:
- Имя встроенного загрузчика платформенных классов —
"platform". - Returns:
- Загрузчик платформенных
ClassLoader. - Throws:
-
SecurityException- Если присутствует менеджер безопасности, и загрузчик класса вызывающего метода неnull, и загрузчик класса вызывающего метода не такой же или не является предком загрузчика платформенных классов, и у вызывающего метода нетRuntimePermission("getClassLoader") - Since:
- 9
getSystemClassLoader
public static ClassLoader getSystemClassLoader()
ClassLoader экземпляров и, как правило, загрузчик классов, используемый для запуска приложения. Этот метод вызывается в начале процесса запуска среды выполнения, в этот момент он создаёт системный загрузчик классов. Этот загрузчик классов будет загрузчиком контекста для основного потока приложения (например, потока, вызывающего метод main основного класса).
По умолчанию системный загрузчик классов является зависящим от реализации экземпляром этого класса.
Если при первом вызове этого метода определён системный параметр "java.system.class.loader", то значение этого параметра принимается как имя класса, который будет возвращён в качестве системного загрузчика классов. Класс загружается с использованием системного загрузчика по умолчанию и должен определять public конструктор, принимающий единственный параметр типа ClassLoader , который используется в качестве родительского загрузчика. Затем экземпляр создаётся с помощью этого конструктора с системным загрузчиком по умолчанию в качестве параметра. Результирующий загрузчик классов определяется как системный загрузчик классов. Во время построения загрузчик классов должен с большой осторожностью избегать вызова getSystemClassLoader(). Если обнаружено циклическое инициализирование системного загрузчика классов, выбрасывается IllegalStateException.
- Implementation Note:
- Системный параметр для переопределения системного загрузчика классов не проверяется до тех пор, пока среда выполнения не будет почти полностью инициализирована. Код, выполняющий этот метод во время запуска, должен быть осторожен и не кешировать возвращаемое значение до тех пор, пока система не будет полностью инициализирована.
Имя встроенного системного загрузчика классов —
"app". Системный параметр "java.class.path" читается в начале инициализации среды выполнения, чтобы определить путь класса. Пустое значение параметра "java.class.path" интерпретируется по-разному в зависимости от того, является ли начальный модуль (модуль, содержащий основной класс) именованным или безымянным: Если именованный, у встроенного системного загрузчика классов не будет пути класса, и он будет искать классы и ресурсы, используя путь модуля приложения; в противном случае, если безымянный, он установит путь класса в текущую рабочую директорию.Файлы JAR в пути класса могут содержать атрибут манифеста
Class-Pathдля указания зависимых файлов JAR, которые должны быть включены в путь класса.Class-Pathзаписи должны соответствовать определённым условиям для проверки (подробности см. в Спецификации JAR-файлов). НедействительныеClass-Pathзаписи игнорируются. Для отладки можно вывести игнорируемые записи в консоль, если системный параметрjdk.net.URLClassPath.showIgnoredClassPathEntriesустановлен вtrue. - Returns:
- Системный загрузчик
ClassLoader - Throws:
-
SecurityException- Если присутствует менеджер безопасности, и загрузчик класса вызывающего метода неnullи не такой же или не является предком системного загрузчика классов, и у вызывающего метода нетRuntimePermission("getClassLoader") -
IllegalStateException- Если вызов происходит рекурсивно во время построения загрузчика классов, указанного системным параметром "java.system.class.loader". -
Error- Если системный параметр "java.system.class.loader" определён, но указанный именованный класс не удалось загрузить, класс-поставщик не определяет необходимый конструктор или в этом конструкторе происходит исключение при вызове. Основная причина ошибки может быть получена через методThrowable.getCause().
definePackage
protected Package definePackage(String name, String specTitle, String specVersion, String specVendor, String implTitle, String implVersion, String implVendor, URL sealBase)
ClassLoader. Имена пакетов должны быть уникальными в загрузчике классов и не могут быть переопределены или изменены после создания.
Если загрузчик классов хочет определить пакет с определёнными свойствами, такими как информация о версии, то загрузчик классов должен вызвать этот definePackage метод перед вызовом defineClass. В противном случае метод defineClass определит пакет в этом загрузчике классов, соответствующий пакету только что определённого класса; свойства этого определённого пакета задаются в Package.
- API Note:
- Загрузчик классов, желающий определить пакет для классов в JAR-файле, обычно использует заголовок, информацию о версии и поставщика из манифеста JAR-файла. Если пакет задан как герметичный в манифесте JAR-файла, то
URLJAR-файла обычно используется в качествеsealBase. Если классы пакета'p'определены этим загрузчиком классов из нескольких JAR-файлов, объектPackageможет содержать различную информацию в зависимости от первого класса пакета'p', который был определён, и чьего манифеста JAR-файла был прочитан первым для явного определения пакета'p'.Сильно рекомендуется, чтобы загрузчик классов не вызывал этот метод для явного определения пакетов в именованных модулях; вместо этого пакет будет автоматически определён при определении класса. Если желательно явно определить
Package, необходимо убедиться, что все пакеты в именованном модуле определены с помощью свойств, указанных вPackage. В противном случае некоторыеPackageобъекты в именованном модуле могут, например, быть запечатаны с разным базовым значением для запечатывания. - Parameters:
-
name- Имя пакета -
specTitle- Заголовок спецификации -
specVersion- Версия спецификации -
specVendor- Поставщик спецификации -
implTitle- Заголовок реализации -
implVersion- Версия реализации -
implVendor- Поставщик реализации -
sealBase- Если неnull, то этот пакет герметичен по отношению к заданному источнику кодаURLобъекту. В противном случае пакет не герметичен. - Returns:
- Новый объект
Package - Throws:
-
NullPointerException- еслиnameявляетсяnull. -
IllegalArgumentException- если пакет с даннымnameуже определён этим загрузчиком классов - See Java Virtual Machine Specification:
- 5.3 Создание и загрузка
- Since:
- 1.2
- See Also:
getDefinedPackage
public final Package getDefinedPackage(String name)
Package заданного имени, определённого этим загрузчиком классов.- Parameters:
-
name- Имя пакета - Returns:
Packageзаданного имени, определённого этим загрузчиком классов, илиnullесли не найдено- Throws:
-
NullPointerException- еслиnameявляетсяnull. - See Java Virtual Machine Specification:
- 5.3 Создание и загрузка
- Since:
- 9
getDefinedPackages
public final Package[] getDefinedPackages()
Packages, определённые этим загрузчиком классов. Возвращаемый массив не содержит повторяющихся Packages с одинаковым именем.- API Note:
- Этот метод возвращает массив, а не
SetилиStreamдля согласованности с существующим методомgetPackages(). - Returns:
- Массив объектов
Package, определённых этим загрузчиком классов; или массив нулевой длины, если ни один пакет не был определён этим загрузчиком классов. - See Java Virtual Machine Specification:
- 5.3 Создание и загрузка
- Since:
- 9
getPackage
@Deprecated(since="9") protected Package getPackage(String name)
getPackage для получения Package от родительского загрузчика, то свойства, раскрываемые Package, могут не соответствовать ожиданиям в остальной части программы. Например, Package будут раскрывать только аннотации из файла package-info.class , определённого родительским загрузчиком, даже если аннотации существуют в файле package-info.class , определённом дочерним загрузчиком. Более надёжный подход заключается в использовании метода getDefinedPackage(java.lang.String), который возвращает Package для указанного загрузчика классов. Если этот загрузчик классов определяет Package заданного имени, то возвращается Package . В противном случае предки этого загрузчика классов ищутся рекурсивно (родитель за родителем) для поиска Package заданного имени.
- API Note:
- Загрузчик платформы
platform class loaderможет делегировать приложение загрузчику классов, но приложение загрузчик классов не является его предком. При вызове этого метода для загрузчика платформы классов, пакеты, определённые для приложения загрузчика классов, не будут найдены. - Parameters:
-
name- Имя пакета - Returns:
Packageзаданного имени, определённого этим загрузчиком классов или его предками, илиnullесли не найден.- Throws:
-
NullPointerException- еслиnameявляетсяnull. - Since:
- 1.2
- See Also:
getPackages
protected Package[] getPackages()
Packages, определённые этим загрузчиком классов и его предками. Возвращаемый массив может содержать более одного объекта Package с одинаковым именем пакета, каждый определённый другим загрузчиком классов в иерархии загрузчиков классов.- API Note:
- Загрузчик платформы
platform class loaderможет делегировать приложение загрузчику классов. Другими словами, пакеты в модулях, определённые для приложения загрузчика классов, могут быть видны загрузчику платформы классов. С другой стороны, приложение загрузчик классов не является его предком, и поэтому при вызове этого метода для загрузчика платформы классов, пакеты, определённые для приложения загрузчика классов, не будут возвращены. - Returns:
- Массив объектов
Package, определённых этим загрузчиком классов и его предками. - Since:
- 1.2
- See Also:
findLibrary
protected String findLibrary(String libname)
null, ВМ ищет библиотеку по пути, указанному как свойство "java.library.path".- Parameters:
-
libname- Имя библиотеки - Returns:
- Абсолютный путь к native библиотеке
- Since:
- 1.2
- See Also:
setDefaultAssertionStatus
public void setDefaultAssertionStatus(boolean enabled)
setPackageAssertionStatus(String, boolean) или setClassAssertionStatus(String, boolean).- Parameters:
-
enabled-trueесли проверки включены по умолчанию для классов, загруженных этим загрузчиком классов,falseесли они отключены по умолчанию. - Since:
- 1.4
setPackageAssertionStatus
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).
- Parameters:
-
packageName- Имя пакета, для которого необходимо установить стандартный статус проверки пакета. Значениеnullуказывает на неопределенный пакет, который является "текущим" (см. раздел 7.4.2 спецификации языка Java). -
enabled-trueесли проверки включены по умолчанию для классов, загруженных этим загрузчиком и принадлежащих к указанному пакету или любому из его подпакетов,falseесли они отключены по умолчанию. - Since:
- 1.4
setClassAssertionStatus
public void setClassAssertionStatus(String className, boolean enabled)
Если указанный класс не является классом верхнего уровня, этот вызов не повлияет на фактический статус проверки какого-либо класса.
- Parameters:
-
className- Полное имя класса верхнего уровня, для которого необходимо установить статус проверки. -
enabled-trueесли проверки должны быть включены для указанного класса при его инициализации (и если это произойдёт),falseесли проверки должны быть отключены. - Since:
- 1.4
clearAssertionStatus
public void clearAssertionStatus()
false и удаляет все стандартные значения пакетов или статусы проверки классов, связанные с загрузчиком классов. Этот метод предоставляется для того, чтобы загрузчики классов могли игнорировать любые параметры проверки командной строки или постоянные настройки статуса проверки и "начать с чистого листа".- Since:
- 1.4
© 1993, 2023, 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/21/docs/api/java.base/java/lang/ClassLoader.html
defineClass(String, byte[], int, int)