Класс 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 |
Устанавливает подписавших класс. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Указывает, равен ли какой-либо другой объект этому объекту. |
protected void |
finalize() |
Устарело, будет удалено: этот элемент API может быть удалён в будущей версии. Финализация устарела и может быть удалена в одном из следующих выпусков. |
final Class |
getClass() |
Возвращает класс среды выполнения для этого Object. |
int |
hashCode() |
Возвращает хеш-код этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания, либо до истечения заданного промежутка реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания, либо до истечения заданного промежутка реального времени. |
Подробное описание конструкторов
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:
- Для обеспечения совместимости этот метод не является окончательным. Если метод переопределен, он должен возвращать то же имя, которое было указано при создании этого загрузчика классов.
- Возвращает:
- имя этого загрузчика классов; или
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).
- Параметры:
-
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в именованном модуле могут, например, быть запечатаны с разной базой запечатывания. - Параметры:
-
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()
Packages, определённые этим загрузчиком классов. В возвращаемом массиве нет повторяющихся Packages с одинаковым именем.- Примечание 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()
Packages, определённые этим загрузчиком классов и его предками. Возвращаемый массив может содержать несколько объектов 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.
defineClass(String, byte[], int, int)