Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации
bgcolor = "#FFFFFF">
Содержание | Предыдущий | Следующий Отражение Ядра Java


Краткий обзор

Java (ТМ), API Reflection Ядра обеспечивает маленький, безопасный с точки зрения типов, и безопасный API, который поддерживает самоанализ о классах и объектах в текущем Java Виртуальный Machine*. Если разрешено политикой безопасности, API может привыкнуть к: Базовый API Reflection определяет классы и методы, следующим образом: Есть также некоторые части java.lang пакет то отражение поддержки. Они:

Приложения

Базовый API Reflection размещает две категории приложений.

Одна категория состоит из приложений, которые должны обнаружить и использовать весь из public элементы цели, основанной на объектах на ее классе времени выполнения. Эти приложения требуют доступа времени выполнения к весь public поля, методы, и конструкторы объекта. Примерами в этой категории являются службы, такие как Java (ТМ) Бобы [1], и легкие инструменты, такие как объектные инспекторы. Эти приложения используют экземпляры классов Field, Method, и Constructor полученный через методы getField, getMethod, getConstructor, getFields, getMethods, и getConstructors из класса Class.

Вторая категория состоит из сложных приложений, которые должны обнаружить и использовать элементы, объявленные данным классом. Эти приложения нуждаются в доступе времени выполнения к реализации класса на уровне, обеспеченном a class файл. Примерами в этой категории являются средства разработки, такие как интерпретаторы, инспекторы, и средства просмотра классов, и службы среды выполнения, такие как Java (ТМ) Сериализация Объекта [2]. Эти приложения используют экземпляры классов Field, Method, и Constructor полученный через методы getDeclaredField, getDeclaredMethod, getDeclaredConstructor, getDeclaredFields, getDeclaredMethods, и getDeclaredConstructors из класса Class.


Отражательная Модель

Эти три класса Field, Method, и Constructor final. Только виртуальная машина Java может создать экземпляры этих классов; эти объекты используются, чтобы управлять базовыми объектами; то есть, к: final класс uninstantiable Array обеспечивает static методы, которые разрешают создавать новые массивы, и получать и устанавливать элементы массивов.

Задействованный Интерфейс

Классы Field, Method и Constructor реализуйте Member интерфейс. Методы Member используются, чтобы запросить отраженный элемент для основной информации об идентификации. Идентификация информации состоит из класса, или взаимодействуйте через интерфейс, который объявил элемент, имя элемента непосредственно, и модификаторы языка Java (такой как public, protected, abstract, synchronized, и так далее) для элемента.

Полевые Объекты

A Field объект представляет отраженное поле. Базовое поле может быть переменной класса (a static поле) или переменная экземпляра (не -static поле). Методы класса Field используются, чтобы получить тип базового поля, и получить и установить значение базового поля на объектах.

Объекты метода

A Method объект представляет отраженный метод. Базовый метод может быть абстрактным методом, методом экземпляра, или классом (static) метод.

Методы класса Method используются, чтобы получить типы формального параметра, тип возврата, и проверенные типы исключения базового метода. Кроме того, invoke метод класса Method используется, чтобы вызвать базовый метод на целевые объекты. Экземпляр и абстрактный вызов метода используют динамическое разрешение метода, основанное на классе времени выполнения целевого объекта и объявлении отраженного метода класса, имени, и типов формального параметра. (Таким образом допустимо вызвать отраженный интерфейсный метод на объект, который является экземпляром класса, который реализует интерфейс.) Статический вызов метода использует базовый статический метод объявления метода класса.

Конструктор Возражает

A Constructor объект представляет отраженного конструктора. Методы класса Constructor используются, чтобы получить типы формального параметра и проверенные типы исключения базового конструктора. Кроме того, newInstance метод класса Constructor используется, чтобы создать и инициализировать новый экземпляр класса, который объявляет конструктора, если класс является instantiable.

Массив и Классы Модификатора

Array класс является uninstantiable классом, который экспортирует методы класса, чтобы создать массивы Java с примитивным или компонентными типами класса. Методы класса Array также используются, чтобы получить и установить компонентные значения массива.

Modifier класс является uninstantiable классом, который экспортирует методы класса, чтобы декодировать модификаторы языка Java для классов и элементов. Модификаторы языка кодируются в целом числе, и используют константы кодирования, определенные Спецификацией виртуальной машины Java.

Представление Примитивных Типов Java

Наконец, есть девять Class объекты, которые используются, чтобы представить восемь примитивных типов Java и void во время выполнения. (Отметьте, что они Class объекты, не классы.) Базовый API Reflection использует эти объекты идентифицировать следующее: Виртуальная машина Java создает эти девять Class объекты. У них есть те же самые имена как типы, которые они представляют. Class на объекты можно только сослаться через следующий public final static переменные:
    

        java.lang.Boolean.TYPE

        java.lang.Character.TYPE

        java.lang.Byte.TYPE

        java.lang.Short.TYPE

        java.lang.Integer.TYPE

        java.lang.Long.TYPE

        java.lang.Float.TYPE

        java.lang.Double.TYPE

        java.lang.Void.TYPE

В частности они Class объекты не доступны через forName метод класса Class.

Модель обеспечения безопасности

Менеджер безопасности Java управляет доступом к Базовому API Reflection на основе класса классом. Есть два уровня проверок, чтобы осуществить безопасность, следующим образом: Начальное стратегическое решение централизуется в двух методах класса SecurityManager: void checkMemberAccess(Class,int) throws SecurityException

Class параметр checkMemberAccess идентифицирует класс или интерфейс, к элементам которого нужно получить доступ. int параметр идентифицирует набор элементов, которые будут получены доступ - также Member.PUBLIC или Member.DECLARED.

void checkPackageAccess(String pkg) throws SecurityException

Политика определяется основанная на том, что полномочия предоставляют вызывающей стороне. Есть два действия класса java.lang.RuntimePermission это влияет на эти политики. Они: Если запрошенный доступ к указанному набору элементов указанного класса отрицается, метод должен бросить a SecurityException. Если запрошенный доступ к набору предоставляют, метод должен возвратиться.

Как утверждено earler, стандартное управление доступом языка Java будет обычно осуществляться, когда отраженный элемент от этого набора будет использоваться, чтобы работать на базовом объекте, то есть, когда:

Если доступ будет лишен в той точке, то отраженный элемент бросит IllegalAccessException. Управление доступом языка Java может быть подавлено для определенного отраженного элемента, устанавливая флаг, используя setAccessible метод, как объяснено ниже.

Языковая политика Java

Политика безопасности языка Java для приложений - то, что любой код может получить отражающий доступ ко всем элементам и конструкторам (включая не -public элементы и конструкторы) любого класса это может соединиться против. По умолчанию код программы, который получает отражающий доступ к элементу или конструктору, может только использовать отраженный элемент или конструктора со стандартным управлением доступом языка Java.

Стандартная политика может быть переопределена, вызывая отраженный элемент setAccessible метод. Возможность вызвать setAccessible методом поочередно управляют suppressAccessChecks цель разрешения ReflectPermission.


Преобразования данных

Определенные методы в отражательном пакете выполняют автоматические преобразования данных между значениями типов примитивов и объектами типов классов. Они - универсальные методы для получения и установки поля и выстраивают компонентные значения, и методы для вызова конструктора и метода.

Есть два типа автоматических преобразований данных. Переносящиеся преобразования преобразовывают из значений типов примитивов к объектам типов классов. Разворачивающие преобразования преобразовывают объекты типов классов к значениям типов примитивов. Правила для этих преобразований определяются в "Обертывании и Разворачивании Преобразований."

Дополнительно, доступ к полю и вызов метода разрешают расширять преобразования на типах примитивов и ссылочных типах. Эти преобразования документируются в Спецификацию языка Java, разделяют 5, и детализируются в "Расширяющихся Преобразованиях."

Обертывание и Разворачивание Преобразований

Примитивное значение автоматически обертывается в объект, когда оно получается через Field.get или Array.get, или когда это возвращается методом, вызванным через Method.invoke.

Точно так же объектное значение автоматически разворачивается когда предоставлено в качестве параметра в контексте, который требует значения типа примитива. Эти контексты:

Следующая таблица показывает корреспонденции между типами примитивов и классом (обертка) типы:
Тип примитива Тип класса
boolean java.lang.Boolean
char java.lang.Character
byte java.lang.Byte
short java.lang.Short
int java.lang.Integer
long java.lang.Long
float java.lang.Float
double java.lang.Double

Метод, который объявляется void возвращает специальную ссылку null когда это вызывается через Method.invoke.

Расширение Преобразований

Отражательный пакет разрешает те же самые расширяющиеся преобразования во время выполнения как разрешено в контекстах вызова метода во время компиляции. Эти преобразования определяются в Спецификации языка Java, разделяют 5.3.

Во время выполнения выполняются расширяющиеся преобразования:

Разрешенные расширяющиеся примитивные преобразования: Разрешенные расширяющиеся ссылочные преобразования:

Упаковка

Базовый API Reflection находится в подпакете java.lang именованный java.lang.reflect. Это избегает проблем совместимости, вызванных правилами импорта пакета Java по умолчанию.

*As, используемые на этом веб-сайте, сроки "виртуальная машина Java" или "JVM", означают виртуальную машину для платформы Java.


Содержание | Предыдущий | Следующий
Copyright 1996, 1997, 1998 Oracle Corp. Все права защищены.

Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами