Класс JavaClass – это тип данных языка JavaScript, представляющий Java_класс. Объект класса JavaClass не имеет своих свойств: все его свойства являются пред_ ставлениями одноименных свойств общедоступных статических полей и методов Java_класса. Эти статические поля и методы иногда называются полями класса и методами класса, чтобы обозначить, что они принадлежат всему классу, а не отдельному экземпляру класса. В отличие от JavaPackage, класс JavaClass допус_ кает возможность перечисления своих свойств в цикле for/in. Примечательно, что объекты класса JavaClass не имеют свойств, представляющих поля и методы экземпляра Java_класса, – отдельные экземпляры Java_классов представляет класс JavaObject, который описывается в следующем разделе.
Как отмечалось ранее, объекты класса JavaClass содержатся в объектах класса JavaPackage. Например, объект java.lang класса JavaPackage содержит свойство System. Таким образом, java.lang.System – это объект класса JavaClass, представ_ ляющий Java_класс java.lang.System. Этот объект JavaClass в свою очередь имеет такие свойства, как out и in, представляющие статические поля класса java.lang.System. Точно таким же способом можно обращаться из JavaScript_сце_ нария к любому стандартному системному Java_классу. Например, класс java.lang.Double имеет имя java.lang.Double (или Packages.java.lang.Double), а класс javax.swing.JButton – имя Packages.javax.swing.JButton.
Еще один способ получить в JavaScript объект класса JavaClass заключается в использовании функции getClass(). Передавая функции getClass() любой объ_ ект класса JavaObject, можно получить объект JavaClass, который будет являться представлением Java_класса этого объекта.1
1 Не следует путать функцию getClass(), возвращающую объект JavaClass, с Java_ методом getClass(), который возвращает объект java.lang.Class.
12.2. Взаимодействие с Java*кодом
Как только экземпляр класса JavaClass получен, с ним можно выполнять некото_ рые действия. Класс JavaClass реализует функциональность LiveConnect, кото_ рая позволяет JavaScript_программам получать и записывать значения общедос_ тупных статических полей Java_классов и вызывать общедоступные статиче_ ские методы Java_классов. Например, java.lang.System – это экземпляр класса JavaClass, а получать и записывать значения статических полей java.lang.System можно следующим образом:
var java_console = java.lang.System.out;
Аналогичным образом производится вызов статических методов java.lang.System:
var java_version = java.lang.System.getProperty("java.version");
Ранее уже говорилось, что Java является строго типизированным языком: все по_ ля, методы и аргументы обладают своими типами. Если попытаться записать зна_ чение в поле или передать аргумент неверного типа, генерируется исключение.
Класс JavaClass имеет одну очень важную особенность. Допускается использо_ вать объекты класса JavaClass в операторе new для создания новых экземпляров Java_классов, т. е. для создания объектов JavaObject. Синтаксически в JavaScript (так же как и в Java) эта операция ничем не отличается от создания обычного JavaScript_объекта:
var d = new java.lang.Double(1.23);
Теперь, когда мы создали объект JavaObject таким способом, можно вернуться к функции getClass() и продемонстрировать, как она используется:
var d = new
java.lang.Double(1.23);
// Создать JavaObject
var d_class
= getClass(d);
//
Получить JavaClass
для JavaObject
if (d_class
== java.lang.Double) ...; //
Это сравнение даст
в результате true
Чтобы не обращаться к объекту класса JavaClass с помощью громоздкого выра_ жения, такого как java.lang.Double, можно определить переменную, которая по_ служит сокращенным псевдонимом:
var Double = java.lang.Double;
Такой прием может служить аналогом применения инструкции import в языке Java и повысить эффективность программ, т. к. в этом случае LiveConnect не при_ дется искать ни свойство lang объекта java, ни свойство Double объекта java.lang.