for(var m in System) print(m); // Выведет статические члены java.lang.System
for(m in f) print(m); // Выведет члены экземпляра java.io.File
// Обратите внимание, что таким способом нельзя перечислить классы в пакете
for (с in java.lang) print(c): // Этот прием не сработает
Rhino
позволяет программам на языке JavaScript получать и изменять значения элементов Java-массивов, как если бы они были JavaScript-массивами. Конечно, Java-массивы отличаются от JavaScript-массивов: они имеют фиксированную длину, их элементы имеют определенный тип, и они не имеют JavaScript-методов, таких как
slice
. В JavaScript не существует синтаксических конструкций, которые могли бы использоваться интерпретатором Rhino для создания Java-массивов в программах на языке JavaScript, поэтому для этой цели необходимо использовать класс java.lang.reflect Array:
// Создать массив из 10 строк и массив из 128 байтов
var words = java.lang.reflect.Array.newlnstance(java.lang.String, 10);
var bytes = java.lang.reflect.Array.newlnstance(java.lang.Byte.TYPE, 128);
// После создания с массивами можно работать как с JavaScript-массивами:
for(var і = 0; і < bytes.length; i++) bytes[i] = i;
Программирование на языке Java часто связано с реализацией интерфейсов. Чаще всего с этой необходимостью приходится сталкиваться при разработке графических интерфейсов, когда каждый обработчик события должен реализовать интерфейс приемника событий. Следующие примеры демонстрируют, как это сделать:
// Интерфейсы: Реализация интерфейсов выглядит следующим образом:
var handler = new java.awt.event.FocusListener({
focusGained: function(e) { printfgot focus"); },
focusLost: function(e) { print("lost focus"): }
}):
// Аналогично выполняется расширение абстрактных классов
Когда Java-метод возбуждает исключение, интерпретатор Rhino продолжает его распространение как JavaScript-исключения. Получить оригинальный Java-объект java.lang.Exception можно через свойство javaException JavaScript-объекта Error:
print(e.javaException); // это обертка для java.lang.NullPointerException
}
Здесь необходимо сделать последнее замечание по поводу преобразования типов в Rhino. Интерпретатор Rhino автоматически преобразует простые числа, логические значения и null. Java-тип char интерпретируется в языке JavaScript как число, так как в языке JavaScript отсутствует символьный тип. JavaScript-строки автоматически преобразуются в Java-строки, но (и это может быть камнем преткновения) Java-строки остаются объектами
java.lang.String
и не преобразуются обратно в JavaScript-строки. Взгляните на следующую строку из примера, приводившегося ранее:
var version = java.lang.System.getProperty("java.version");
После выполнения этой инструкции переменная version будет хранить объект java.lang.String. Он обычно ведет себя как JavaScript-строка, но существуют важные отличия. Во-первых, Java-строка вместо свойства length имеет метод length. Во-вторых, оператор typeof возвращает тип «object» для Java-строк. Java-строку нельзя преобразовать в JavaScript-строку вызовом метода toString, потому что все Java-объекты имеют собственные методы toString, возвращающие экземпляры javadang.String. Чтобы преобразовать Java-значение в строку, его нужно передать JavaScript-функции String: