Класс 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-среда выполнения имеет следующие встроенные классы-загрузчики:Bootstrap class loader. Это встроенный класс-загрузчик виртуальной машины, обычно представленный как
null, и не имеет родителя.-
Platform class loader. Класс-загрузчик платформы отвечает за загрузку платформенных классов. Платформенные классы включают API платформы Java SE, их классы реализации и специфичные для JDK классы времени выполнения, которые определены классом-загрузчиком платформы или его предками. Класс-загрузчик платформы может использоваться в качестве родителя экземпляра
ClassLoader.Для возможности обновления/переопределения модулей, определенных для класс-загрузчика платформы, и в тех случаях, когда обновленные модули считывают модули, определенные для классов-загрузчиков, отличных от класс-загрузчика платформы и его предков, класс-загрузчик платформы может быть вынужден делегировать другим классам-загрузчикам, например, классу-загрузчику приложения. Другими словами, классы в именованных модулях, определенные для классов-загрузчиков, отличных от класс-загрузчика платформы и его предков, могут быть видны классу-загрузчику платформы.
System class loader. Он также известен как класс-загрузчик приложения и отличается от класса-загрузчика платформы. Класс-загрузчик системы обычно используется для определения классов в пути приложения, пути модуля и специфичных для 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 |
Создаёт новый загрузчик классов, используя загрузчик родительских классов, возвращаемый методом 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() |
|
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(для загрузчика Bootstrap), нет гарантии, что все платформенные классы будут видны. - Параметры:
-
name- имя загрузчика классов; илиnull, если имя не указано -
parent- родительский загрузчик классов - Исключения:
-
IllegalArgumentException- если заданное имя пустое. - С:
- 9
ClassLoader
protected ClassLoader(ClassLoader parent)
- Примечание API:
- Если родительский загрузчик указан как
null(для загрузчика Bootstrap), нет гарантии, что все платформенные классы будут видны. - Параметры:
-
parent- Родительский загрузчик классов - С:
- 1.2
ClassLoader
protected ClassLoader()
ClassLoader, возвращаемый методом getSystemClassLoader(), как родительский загрузчик классов.Подробное описание методов
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 новому определённому классу. Метод getPermissions класса ProtectionDomain всегда возвращает null. По умолчанию область защиты создаётся при первом вызове defineClass и используется повторно при последующих вызовах.
Чтобы назначить определённую ProtectionDomain классу, используйте метод defineClass, принимающий ProtectionDomain в качестве одного из аргументов.
Этот метод определяет пакет в этом загрузчике классов, соответствующий пакету Class (если такой пакет ещё не был определён в этом загрузчике классов). Имя определённого пакета выводится из имени бинарного файла класса, указанного в массиве байтов b. Другие свойства определённого пакета указаны в Package.
- Параметры:
-
name- Ожидаемое имя бинарного файла класса, илиnull, если оно неизвестно -
b- Байты, составляющие данные класса. Байты с позицийoffпоoff+len-1должны иметь формат файла класса, определённого в Спецификации виртуальной машины Java. -
off- Начальный смещение вbданных класса. -
len- Длина данных класса. - Возвращает:
- Объект
Class, созданный из указанных данных класса. - Исключения:
-
ClassFormatError- Если данные не содержат допустимого класса. -
IndexOutOfBoundsException- Если либоoff, либоlenотрицательные, или еслиoff+lenбольше, чемb.length. -
SecurityException- Если предпринята попытка добавить этот класс в пакет, содержащий классы, подписанные другим набором сертификатов, чем этот класс (который не подписан), или еслиnameначинается с "java.". - С:
- 1.1
- См. также:
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.
- Параметры:
-
name- Ожидаемое имя бинарного файла класса, илиnull, если оно неизвестно -
b- Байты, составляющие данные класса. Байты с позицийoffпоoff+len-1должны иметь формат файла класса, определённого в Спецификации виртуальной машины Java. -
off- Начальный смещение вbданных класса. -
len- Длина данных класса. -
protectionDomain-ProtectionDomainкласса. - Возвращает:
- Объект
Class, созданный из данных, иProtectionDomain. - Исключения:
-
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);
- Параметры:
-
name- Ожидаемое имя бинарного файла. класса, илиnull, если оно неизвестно -
b- Байты, составляющие данные класса. Байты с позицийb.position()поb.position() + b.limit() -1должны иметь формат файла класса, определённого в Спецификации виртуальной машины Java. -
protectionDomain-ProtectionDomainкласса, илиnull. - Возвращает:
- Объект
Class, созданный из данных, иProtectionDomain. - Исключения:
-
ClassFormatError- Если данные не содержат допустимого класса. -
NoClassDefFoundError- Еслиnameне равноnullи не равно имени бинарного файла класса, указанного вb -
SecurityException- Если предпринята попытка добавить этот класс в пакет, содержащий классы, подписанные другим набором сертификатов, чем этот класс, или еслиnameначинается с "java.". - С:
- 1.5
- См. также:
resolveClass
protected final void resolveClass(Class<?> c)
c уже связан, то этот метод просто возвращает. В противном случае класс связывается, как описано в главе "Выполнение" Спецификации языка Java.- Параметры:
-
c- Класс для связывания - Исключения:
-
NullPointerException- Еслиcравноnull. - См. также:
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
registerAsParallelCapable
protected static boolean registerAsParallelCapable()
- экземпляр вызывающего объекта не был создан
- все суперклассы (кроме класса Object) вызывающего объекта зарегистрированы как поддерживающие параллельную работу
Обратите внимание, что после регистрации загрузчика класса как поддерживающего параллельную работу, его нельзя изменить обратно.
В случаях, когда этот метод вызывается из контекста, где вызывающий объект не является подклассом ClassLoader или в стеке нет фрейма вызова (например, при прямом вызове из нити JNI), выбрасывается IllegalCallerException.
- Возвращает:
-
true, если вызывающий объект успешно зарегистрирован как поддерживающий параллельную работу, иfalseв противном случае. - Выбрасывает:
-
IllegalCallerException— если вызывающий объект не является подклассомClassLoader - С:
- 1.7
- См. также:
isRegisteredAsParallelCapable
public final boolean isRegisteredAsParallelCapable()
true, если этот загрузчик классов зарегистрирован как поддерживающий параллельную работу, в противном случае false.- Возвращает:
-
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 безусловно.
- Параметры:
-
name- Имя ресурса - Возвращает:
- Поток ввода для чтения ресурса;
null, если ресурс не найден или ресурс находится в пакете, который не открыт безусловно. - С:
- 1.1
getParent
public final ClassLoader getParent()
null для представления загрузчика bootstrap-классов. Этот метод вернёт null в таких реализациях, если родительским загрузчиком этого загрузчика является загрузчик bootstrap-классов.- Возвращает:
- Родительский загрузчик классов
- С:
- 1.2
getUnnamedModule
public final Module getUnnamedModule()
Module для этого загрузчика классов.- Возвращает:
- Безымянный модуль для данного загрузчика классов
- С:
- 9
- См. также:
getPlatformClassLoader
public static ClassLoader getPlatformClassLoader()
- Примечание реализации:
- Имя встроенного загрузчика платформенных классов —
"platform". - Возвращает:
- Платформенный загрузчик классов.
- С:
- 9
getSystemClassLoader
public static ClassLoader getSystemClassLoader()
ClassLoader экземпляров и обычно используется для запуска приложения. Этот метод вызывается в самом начале процесса запуска среды выполнения, в этот момент он создаёт системный загрузчик классов. Этот загрузчик будет загрузчиком контекста для основного потока приложения (например, потока, вызывающего метод main основного класса).
Системный загрузчик классов по умолчанию — это зависящий от реализации экземпляр этого класса.
Если при вызове этого метода определена системная переменная "java.system.class.loader", то значение этой переменной рассматривается как имя класса, который будет возвращён как системный загрузчик классов. Класс загружается с помощью системного загрузчика по умолчанию и должен иметь публичный конструктор, принимающий один параметр типа ClassLoader, который используется в качестве родительского загрузчика. Затем экземпляр создаётся с помощью этого конструктора с системным загрузчиком по умолчанию в качестве параметра. Полученный загрузчик классов определяется как системный загрузчик классов. Во время создания загрузчик классов должен быть очень осторожен, чтобы не вызывать getSystemClassLoader(). Если обнаружено циклическое инициализирование системного загрузчика классов, то выбрасывается IllegalStateException.
- Примечание реализации:
- Системная переменная для переопределения системного загрузчика классов не проверяется до тех пор, пока не произойдёт почти полная инициализация JVM. Код, выполняющий этот метод во время запуска, должен быть осторожен, чтобы не кэшировать возвращаемое значение до полной инициализации системы.
Имя встроенного системного загрузчика классов —
"app". Системная переменная "java.class.path" считывается во время ранней инициализации JVM, чтобы определить путь класса. Пустое значение свойства "java.class.path" интерпретируется по-разному в зависимости от того, является ли начальный модуль (модуль, содержащий главный класс) именованным или безымянным: если именованным, встроенный системный загрузчик классов не будет иметь путь класса и будет искать классы и ресурсы, используя путь модуля приложения; в противном случае, если безымянным, он установит путь класса в текущую рабочую директорию.JAR-файлы в пути класса могут содержать атрибут
Class-Pathmanifest для указания зависимых JAR-файлов, которые необходимо включить в путь класса.Class-Pathзаписи должны удовлетворять определённым условиям для валидности (см. JAR-спецификацию файла для получения подробной информации). НекорректныеClass-Pathзаписи игнорируются. В отладочных целях проигнорированные записи могут быть напечатаны в консоль, если системная переменнаяjdk.net.URLClassPath.showIgnoredClassPathEntriesустановлена вtrue. - Возвращает:
- Системный загрузчик классов
- Исключения:
-
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:
- Загрузчик классов, который хочет определить пакет для классов в JAR, обычно использует заголовок, версия, поставщик из манифеста JAR. Если в манифесте JAR пакет определён как sealed, то
URLфайла JAR обычно используется в качествеsealBase. Если классы пакета'p', определённые этим загрузчиком классов, загружаются из нескольких JAR, объектPackageможет содержать различную информацию в зависимости от первого класса пакета'p', определённого и которого JAR-манифест был прочитан первым для явного определения пакета'p'.Настоятельно рекомендуется, чтобы загрузчик классов не вызывал этот метод для явного определения пакетов в именованных модулях; вместо этого пакет будет автоматически определён при определении класса. Если необходимо явно определить
Package, то нужно убедиться, что все пакеты в именованном модуле определены со свойствами, указанными вPackage. В противном случае, некоторыеPackageобъекты в именованном модуле могут быть, например, sealed с разными seal base. - Параметры:
-
name- Имя пакета -
specTitle- Название спецификации -
specVersion- Версия спецификации -
specVendor- Поставщик спецификации -
implTitle- Название реализации -
implVersion- Версия реализации -
implVendor- Поставщик реализации -
sealBase- Если неnull, то этот пакет запечатан по отношению к указанному источнику кодаURLобъекту. В противном случае пакет не запечатан. - Возвращает:
- Новый определённый объект пакета
- Исключения:
-
NullPointerException- еслиnameявляетсяnull. -
IllegalArgumentException- если пакет с указаннымnameуже определён этим загрузчиком классов - См. Спецификацию Java Virtual Machine:
- 5.3 Создание и загрузка
- С:
- 1.2
- См. также:
getDefinedPackage
public final Package getDefinedPackage(String name)
Package указанного имени, который был определён этим загрузчиком классов.- Параметры:
-
name- Имя пакета - Возвращает:
- Объект пакета указанного имени, определённого этим загрузчиком классов, или
nullесли не найден - Исключения:
-
NullPointerException- еслиnameявляетсяnull. - См. Спецификацию Java Virtual Machine:
- 5.3 Создание и загрузка
- С:
- 9
getDefinedPackages
public final Package[] getDefinedPackages()
- API Note:
- Этот метод возвращает массив, а не объект типа `Enumeration` или `Iterator`, для согласованности с существующим методом
getPackages(). - Returns:
- Массив объектов `Package`, определённых этим загрузчиком классов; или массив нулевой длины, если пакеты этим загрузчиком не определены.
- См. Спецификацию виртуальной машины Java:
- 5.3 Создание и загрузка
- Since:
- 9
getPackage
@Deprecated(since="9") protected Package getPackage(String name)
getPackage для возврата пакета из родительского загрузчика, то свойства, экспонируемые Package, могут не соответствовать ожиданиям в остальной части программы. Например, Package будет экспонировать только аннотации из файла package-info.class, определённого родительским загрузчиком, даже если аннотации существуют в файле package-info.class, определённом дочерним загрузчиком. Более надёжный подход заключается в использовании метода getDefinedPackage(java.lang.String), который возвращает объект `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()
- API Note:
- Загрузчик платформенных классов (
platform class loader) может делегировать запросы к загрузчику приложений. Иначе говоря, пакеты, определённые в модулях загрузчиком приложений, могут быть видимы загрузчику платформы. С другой стороны, загрузчик приложений не является его предком, и, следовательно, при вызове на платформенном загрузчике этот метод не вернёт пакеты, определённые в загрузчике приложений. - Returns:
- Массив объектов `Package`, определённых этим загрузчиком классов и его предками
- Since:
- 1.2
- See Also:
findLibrary
protected String findLibrary(String libname)
java.library.path".- Parameters:
-
libname- Имя библиотеки - Returns:
- Абсолютный путь к библиотеке
- 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()
- Since:
- 1.4
© 1993, 2025, 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/ClassLoader.html
defineClass(String, byte[], int, int)