Класс ClassLoader
- Непосредственные известные подклассы:
SecureClassLoader
public abstract class ClassLoader extends Object
ClassLoader является абстрактным классом. Получив двоичное имя класса, загрузчик классов должен попытаться найти или создать данные, составляющие определение класса. Типичная стратегия заключается в преобразовании имени в имя файла, а затем чтении «файла класса» с этим именем из файловой системы. Каждый объект Class содержит reference к ClassLoader, которым он был определён.
Объекты Class для классов массивов не создаются загрузчиками классов, а создаются автоматически по мере необходимости средой выполнения 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— если заданное имя пусто. - С версии:
- 9
ClassLoader
protected ClassLoader(ClassLoader parent)
- Примечание API:
- Если в качестве родительского загрузчика указан
null(для загрузчика классов начальной загрузки), нет гарантии, что будут видны все классы платформы. - Параметры:
-
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имеет значение 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).
- Параметры:
-
name— двоичное имя класса - Возвращает:
- объект
Classдля указанногоname - Исключения:
-
ClassNotFoundException— если класс не найден - См. также:
findLoadedClass
protected final Class<?> findLoadedClass(String name)
null.- Параметры:
-
name— двоичное имя класса - Возвращает:
- объект
Classилиnull, если класс не был загружен - С версии:
- 1.1
setSigners
protected final void setSigners(Class<?> c, Object[] signers)
- Параметры:
-
c— объектClass -
signers— подписанты класса - С версии:
- 1.1
findResource
protected URL findResource(String moduleName, String name) throws IOException
- Примечание API:
- Этот метод лежит в основе методов
Class.getResource,Class.getResourceAsStreamиModule.getResourceAsStream. На него не распространяются правила инкапсуляции, заданныеModule.getResourceAsStream. - Требования к реализации:
- Реализация по умолчанию пытается найти ресурс, вызывая
findResource(String), еслиmoduleNameимеет значениеnull. В противном случае она возвращаетnull. - Параметры:
-
moduleName— имя модуля; илиnull, чтобы найти ресурс в безымянном модуле этого загрузчика классов -
name— имя ресурса - Возвращает:
- URL ресурса;
null, если ресурс не найден, для его поиска не удалось сформировать URL или загрузчику классов не определен модуль с указанным именем. - Исключения:
-
IOException— при возникновении ошибок ввода-вывода - С версии:
- 9
- См. также:
getResource
public URL getResource(String name)
Имя ресурса представляет собой путь, компоненты которого разделены символом «/» и который идентифицирует ресурс.
На ресурсы в именованных модулях распространяются правила инкапсуляции, указанные в Module.getResourceAsStream. Кроме того, за исключением особого случая, когда имя ресурса заканчивается на ".class", этот метод будет находить ресурсы в пакетах именованных модулей только в том случае, если пакет opened безусловно (даже если вызывающий этот метод код находится в том же модуле, что и ресурс).
- Примечание API:
- Если одному загрузчику классов определено несколько модулей и более чем один модуль содержит ресурс с указанным именем, порядок поиска по модулям не определен и может быть весьма непредсказуемым. При переопределении этого метода рекомендуется обеспечить, чтобы любое делегирование было согласовано с методом
getResources(String). - Требования к реализации:
- Реализация по умолчанию сначала ищет ресурс в родительском загрузчике классов; если родительский загрузчик равен
null, выполняется поиск по пути загрузчика классов, встроенного в виртуальную машину. Если ресурс не найден, этот метод вызываетfindResource(String)для его поиска. - Параметры:
-
name— имя ресурса - Возвращает:
-
URLдля чтения ресурса;null, если ресурс не найден, для его поиска не удалось сформироватьURLили ресурс находится в пакете, который не открыт безусловно. - Исключения:
-
NullPointerException— еслиnameравноnull - С версии:
- 1.1
getResources
public Enumeration<URL> getResources(String name) throws IOException
Имя ресурса — это путь, разделённый /, который идентифицирует ресурс.
На ресурсы в именованных модулях распространяются правила инкапсуляции, указанные в Module.getResourceAsStream. Кроме того, за исключением особого случая, когда имя ресурса заканчивается на ".class", этот метод найдёт ресурсы в пакетах именованных модулей только в том случае, если пакет безусловно opened (даже если вызывающий этот метод код находится в том же модуле, что и ресурс).
- Примечание API:
- Если несколько модулей определены одним и тем же загрузчиком классов и более одного модуля содержит ресурс с заданным именем, порядок не определён и может быть совершенно непредсказуемым. При переопределении этого метода рекомендуется обеспечить согласованность делегирования с методом
getResource(String). Это должно гарантировать, что первый элемент, возвращаемый методомnextElementперечисления, является тем же ресурсом, который вернул бы методgetResource(String). - Требования к реализации:
- Реализация по умолчанию сначала ищет ресурс в родительском загрузчике классов; если родительский загрузчик —
null, выполняется поиск по пути загрузчика классов, встроенного в виртуальную машину. Затем она вызываетfindResources(String), чтобы найти ресурсы с заданным именем в этом загрузчике классов. Она возвращает перечисление, элементы которого представляют URL-адреса, найденные при поиске в родительском загрузчике классов, за которыми следуют элементы, найденные с помощьюfindResources. - Параметры:
-
name— имя ресурса - Возвращает:
- Перечисление объектов
URLдля ресурса. Если ресурсы не найдены, перечисление будет пустым. В перечисление не включаются ресурсы, для которых невозможно создатьURL, или которые находятся в пакете, не открытом безусловно. - Исключения:
-
IOException— если возникает ошибка ввода-вывода -
NullPointerException— еслиnameимеет значениеnull - Начиная с версии:
- 1.2
resources
public Stream<URL> resources(String name)
Имя ресурса — это путь, разделённый /, который идентифицирует ресурс.
Поиск ресурсов выполняется при обработке возвращённого потока. Если обработка приводит к возникновению IOException, исключение ввода-вывода оборачивается в UncheckedIOException, которое затем выбрасывается.
На ресурсы в именованных модулях распространяются правила инкапсуляции, указанные в Module.getResourceAsStream. Кроме того, за исключением особого случая, когда имя ресурса заканчивается на ".class", этот метод найдёт ресурсы в пакетах именованных модулей только в том случае, если пакет безусловно opened (даже если вызывающий этот метод код находится в том же модуле, что и ресурс).
- Примечание API:
- При переопределении этого метода рекомендуется обеспечить согласованность делегирования с методом
getResource(String). Это должно гарантировать, что первый элемент, возвращаемый потоком, является тем же ресурсом, который вернул бы методgetResource(String). - Требования к реализации:
- Реализация по умолчанию вызывает
getResources, чтобы найти все ресурсы с заданным именем, и возвращает поток, источником которого являются элементы перечисления. - Параметры:
-
name— имя ресурса - Возвращает:
- Поток объектов ресурса
URL. Если ресурсы не найдены, поток будет пустым. В поток не включаются ресурсы, для которых невозможно создатьURL, или которые находятся в пакете, не открытом безусловно. - Исключения:
-
NullPointerException— еслиnameимеет значениеnull - Начиная с версии:
- 9
findResource
protected URL findResource(String name)
Для ресурсов в именованных модулях метод должен реализовывать правила инкапсуляции, указанные в методе Module getResourceAsStream. Кроме того, он не должен находить ресурсы, отличные от ".class", в пакетах именованных модулей, если только пакет не opened безусловно.
- Требования к реализации:
- Реализация по умолчанию возвращает
null. - Параметры:
-
name— имя ресурса - Возвращает:
-
URLдля чтения ресурса;null, если ресурс не найден, невозможно создатьURLдля поиска ресурса или ресурс находится в пакете, не открытом безусловно. - Начиная с версии:
- 1.2
findResources
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. В таких реализациях этот метод вернёт null, если родительским загрузчиком данного загрузчика классов является загрузчик начальной загрузки.- Возвращает:
- Родительский
ClassLoader - Начиная с версии:
- 1.2
getUnnamedModule
public final Module getUnnamedModule()
Module для этого загрузчика классов.- Возвращает:
- Безымянный модуль для этого загрузчика классов
- Начиная с версии:
- 9
- См. также:
getPlatformClassLoader
public static ClassLoader getPlatformClassLoader()
- Примечание по реализации:
- Имя встроенного загрузчика классов платформы —
"platform". - Возвращает:
- Загрузчик классов платформы
ClassLoader. - Начиная с версии:
- 9
getSystemClassLoader
public static ClassLoader getSystemClassLoader()
ClassLoader и обычно представляет собой загрузчик классов, используемый для запуска приложения. Этот метод впервые вызывается на раннем этапе запуска среды выполнения; в этот момент он создаёт системный загрузчик классов. Этот загрузчик классов будет контекстным загрузчиком классов основного потока приложения (например, потока, который вызывает метод main главного класса).
Системный загрузчик классов по умолчанию является экземпляром этого класса, зависящим от реализации.
Если при первом вызове этого метода задано системное свойство "java.system.class.loader", значение этого свойства считается именем класса, который будет возвращён в качестве системного загрузчика классов. Класс загружается с помощью системного загрузчика классов по умолчанию и должен определять открытый конструктор, принимающий единственный параметр типа ClassLoader, который используется в качестве родительского загрузчика для делегирования. Затем с помощью этого конструктора создаётся экземпляр, которому в качестве параметра передаётся системный загрузчик классов по умолчанию. Полученный загрузчик классов назначается системным загрузчиком классов. Во время создания загрузчику классов следует тщательно избегать вызова getSystemClassLoader(). Если обнаружена циклическая инициализация системного загрузчика классов, выбрасывается IllegalStateException.
- Примечание по реализации:
- Системное свойство, позволяющее переопределить системный загрузчик классов, проверяется только после почти полной инициализации виртуальной машины. Код, вызывающий этот метод во время запуска, не должен кэшировать возвращаемое значение до полной инициализации системы.
Имя встроенного системного загрузчика классов —
"app". Системное свойство "java.class.path" считывается на раннем этапе инициализации виртуальной машины для определения пути классов. Пустое значение свойства "java.class.path" интерпретируется по-разному в зависимости от того, является ли исходный модуль (модуль, содержащий главный класс) именованным или безымянным: если он именованный, встроенный системный загрузчик классов не будет иметь пути классов и будет искать классы и ресурсы по пути модулей приложения; если же он безымянный, путь классов будет установлен в текущий рабочий каталог.JAR-файлы в пути классов могут содержать атрибут манифеста
Class-Path, указывающий зависимые JAR-файлы, которые следует включить в путь классов. ЗаписиClass-Pathдолжны соответствовать определённым условиям допустимости (подробности см. в спецификации JAR-файлов). Недопустимые записиClass-Pathигнорируются. Для отладки игнорируемые записи можно выводить на консоль, если системное свойствоjdk.net.URLClassPath.showIgnoredClassPathEntriesустановлено в значениеtrue. - Возвращает:
- Системный
ClassLoader - Исключения:
-
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-файла как запечатанный, в качестве
sealBaseобычно используетсяURLJAR-файла. Если классы пакета'p', определённого этим загрузчиком классов, загружаются из нескольких JAR-файлов, объектPackageможет содержать разные сведения в зависимости от того, какой класс пакета'p'был определён первым и манифест какого JAR-файла был первым прочитан для явного определения пакета'p'.Настоятельно рекомендуется, чтобы загрузчик классов не вызывал этот метод для явного определения пакетов в именованных модулях; вместо этого пакет будет определён автоматически при определении класса. Если необходимо явно определить
Package, следует убедиться, что все пакеты именованного модуля определены со свойствами, указанными вPackage. В противном случае некоторые объектыPackageв именованном модуле могут, например, быть запечатаны с разными базовыми URL запечатывания. - Параметры:
-
name— имя пакета -
specTitle— заголовок спецификации -
specVersion— версия спецификации -
specVendor— поставщик спецификации -
implTitle— заголовок реализации -
implVersion— версия реализации -
implVendor— поставщик реализации -
sealBase— если значение не равноnull, пакет запечатывается относительно указанного объектаURLисточника кода. В противном случае пакет не запечатывается. - Возвращает:
- Вновь определённый объект
Package - Исключения:
-
NullPointerException— еслиnameимеет значениеnull. -
IllegalArgumentException— если пакет с указаннымnameуже определён этим загрузчиком классов - См. Спецификацию виртуальной машины Java:
- 5.3 Создание и загрузка
- Начиная с версии:
- 1.2
- См. также:
getDefinedPackage
public final Package getDefinedPackage(String name)
Package с заданным именем, определённый этим загрузчиком классов.- Параметры:
-
name— имя пакета - Возвращает:
Packageс заданным именем, определённый этим загрузчиком классов, илиnull, если он не найден- Исключения:
-
NullPointerException— еслиnameимеет значениеnull. - См. Спецификацию виртуальной машины Java:
- 5.3 Создание и загрузка
- Начиная с версии:
- 9
getDefinedPackages
public final Package[] getDefinedPackages()
Package, определённые этим загрузчиком классов. В возвращаемом массиве нет повторяющихся Package с одинаковыми именами.- Примечание API:
- Этот метод возвращает массив, а не
SetилиStream, чтобы соответствовать существующему методуgetPackages(). - Возвращает:
- Массив объектов
Package, определённых этим загрузчиком классов; если загрузчик классов не определил ни одного пакета, возвращается массив нулевой длины. - См. Спецификацию виртуальной машины Java:
- 5.3 Создание и загрузка
- Начиная с версии:
- 9
getPackage
@Deprecated(since="9") protected Package getPackage(String name)
getPackage, чтобы получить Package от родительского загрузчика, свойства, предоставляемые Package, могут не соответствовать ожиданиям остальной части программы. Например, Package будет предоставлять только аннотации из файла package-info.class, определённого родительским загрузчиком, даже если аннотации есть в файле package-info.class, определённом дочерним загрузчиком. Более надёжный подход — использовать метод getDefinedPackage(String), который возвращает Package для указанного загрузчика классов. Если этот загрузчик классов определяет Package с заданным именем, возвращается Package. В противном случае поиск Package с заданным именем рекурсивно выполняется среди предков этого загрузчика классов (по одному родительскому загрузчику за раз).
- Примечание API:
platform class loaderможет делегировать загрузку загрузчику классов приложения, однако загрузчик классов приложения не является его предком. При вызове для загрузчика классов платформы этот метод не найдёт пакеты, определённые загрузчику классов приложения.- Параметры:
-
name— имя пакета - Возвращает:
Packageс заданным именем, определённый этим загрузчиком классов или одним из его предков, либоnull, если он не найден.- Исключения:
-
NullPointerException— еслиnameимеет значениеnull. - Начиная с версии:
- 1.2
- См. также:
getPackages
protected Package[] getPackages()
Package, определённые этим загрузчиком классов и его предками. Возвращаемый массив может содержать несколько объектов Package с одинаковым именем пакета, каждый из которых определён разным загрузчиком классов в иерархии загрузчиков.- Примечание API:
platform class loaderможет делегировать загрузку загрузчику классов приложения. Иными словами, пакеты в модулях, определённых для загрузчика классов приложения, могут быть видны загрузчику классов платформы. Однако загрузчик классов приложения не является его предком, поэтому при вызове для загрузчика классов платформы этот метод не вернёт пакеты, определённые загрузчику классов приложения.- Возвращает:
- Массив объектов
Package, определённых этим загрузчиком классов и его предками - Начиная с версии:
- 1.2
- См. также:
findLibrary
protected String findLibrary(String libname)
null, ВМ ищет библиотеку по пути, указанному в свойстве "java.library.path".- Параметры:
-
libname— имя библиотеки - Возвращает:
- Абсолютный путь к нативной библиотеке
- С версии:
- 1.2
- См. также:
setDefaultAssertionStatus
public void setDefaultAssertionStatus(boolean enabled)
setPackageAssertionStatus(String, boolean) или setClassAssertionStatus(String, boolean).- Параметры:
-
enabled—true, если для классов, загружаемых этим загрузчиком классов, впредь должны быть включены утверждения по умолчанию,false, если для них должны быть отключены утверждения по умолчанию. - С версии:
- 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).
- Параметры:
-
packageName— имя пакета, для которого необходимо установить статус утверждений по умолчанию. Значениеnullуказывает на безымянный пакет, который является «текущим» (см. раздел 7.4.2 Спецификации языка Java.) -
enabled—true, если для классов, загружаемых этим загрузчиком классов и принадлежащих указанному пакету или любому из его подпакетов, должны быть включены утверждения по умолчанию,false, если для них должны быть отключены утверждения по умолчанию. - С версии:
- 1.4
setClassAssertionStatus
public void setClassAssertionStatus(String className, boolean enabled)
Если указанный класс не является классом верхнего уровня, этот вызов не повлияет на фактический статус утверждений ни одного класса.
- Параметры:
-
className— полное имя класса верхнего уровня, для которого требуется установить статус утверждений. -
enabled—true, если для указанного класса следует включить утверждения при его инициализации (если она произойдет),false, если для класса следует отключить утверждения. - С версии:
- 1.4
clearAssertionStatus
public void clearAssertionStatus()
false и удаляет все значения по умолчанию для пакетов и настройки статуса утверждений классов, связанные с загрузчиком классов. Этот метод предоставлен для того, чтобы загрузчики классов могли игнорировать любые настройки статуса утверждений, заданные в командной строке или сохраненные ранее, и «начинать с чистого листа».- С версии:
- 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://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/ClassLoader.html
defineClass(String, byte[], int, int)