Класс JavaObject – это тип JavaScript_данных, представляющий Java_объект. Класс JavaObject во многом похож на класс JavaClass. Как и JavaClass, объект JavaObject не имеет собственных свойств – все его свойства являются представле_ ниями (с теми же именами) общедоступных полей экземпляра и общедоступных методов экземпляра Java_объекта, который он представляет. Как и в случае
с JavaClass, имеется возможность перечислить все свойства объекта JavaObject
с помощью цикла for/in. Класс JavaObject реализует функциональность LiveCon_ nect, которая позволяет получать и записывать значения общедоступных полей экземпляра и вызывать общедоступные методы Java_объекта.
Например, если предположить, что d – это объект JavaObject, представляющий экземпляр класса java.lang.Double, тогда вызвать метод Java_объекта из Java_ Script_сценария можно следующим образом:
n = d.doubleValue();
Как было показано ранее, класс java.lang.System имеет статическое поле out. Это поле ссылается на Java_объект класса java.io.PrintStream. В JavaScript ссылка на соответствующий объект JavaObject выглядит следующим образом:
java.lang.System.out
Вызов метода этого объекта выполняется так:
java.lang.System.out.println("Hello world!");
Кроме того, объект JavaObject позволяет получать и записывать значения обще_ доступных полей экземпляра Java_объекта, который он представляет. Хотя ни класс java.lang.Double, ни класс java.io.PrintStream из предыдущих примеров не имеют общедоступных полей экземпляра, предположим, что JavaScript_сцена_ рий создает экземпляр класса java.awt.Rectangle:
12.2. Взаимодействие с Java*кодом
r = new java.awt.Rectangle( );
Тогда обратиться к общедоступным полям экземпляра из JavaScript_сценария можно следующим образом:
r.x = r.y = 0; r.width = 4; r.height = 5;
var perimeter = 2*r.width + 2*r.height;
Вся прелесть LiveConnect состоит в том, что благодаря этой технологии появля_ ется возможность использовать Java_объекты так, как если бы они были обыч_ ными JavaScript_объектами. Однако здесь следует сделать несколько замечаний: r – это экземпляр класса JavaObject, и он ведет себя не совсем так, как обычные JavaScript_объекты (подробнее о различиях рассказывается далее). Кроме того, не следует забывать, что в отличие от JavaScript, поля Java_объектов и аргумен_ ты Java_методов являются типизированными. Если передать им JavaScript_зна_ чение неверного типа1, интерпретатор JavaScript сгенерирует исключение.