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


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

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

Приложения

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

Modifier class является uninstantiable class, который экспортирует методы class, чтобы декодировать модификаторы языка 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 Class.

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

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

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

void checkPackageAccess(String pkg) throws SecurityException

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

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

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

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

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

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


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

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

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

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

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

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

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

Следующая таблица показывает корреспонденции между типами примитивов и class (обертка) типы:
Тип примитива Тип класса
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, 2012, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами