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