JavaScript. Подробное руководство, 6-е издание, стр. 160
<b>// Rhino отображает методы доступа в отдельные свойства JavaScript </b><b>f.name // => "/tmp/test": вызовет f.getName()</b><b>f.directory // => false: вызовет f.isDirectory()</b>В языке Java имеется возможность создавать перегруженные версии методов, имеющие одинаковые имена, но разные сигнатуры. Обычно интерпретатор Rhino способен определить, какую версию метода следует вызвать, опираясь на типы аргументов, которые передаются программой на языке JavaScript. Однако иногда бывает необходимо явно идентифицировать метод по имени и сигнатуре:
<b>// Предположим, что Java-объект о имеет метод f, который принимает целое</b><b>// или вещественное число. В JavaScript необходимо будет явно указать сигнатуру: </b><b>о[’f(int)'](3); // Вызвать метод, принимающий целое число</b><b>о['f(float)'](Math.PI); // Вызвать метод, принимающий вещественное число</b>Для итераций по методам, полям и свойствам Java-классов можно использовать цикл
<b>for/in</b><b>importClass(java.lang.System);</b><b>for(var m in System) print(m); // Выведет статические члены java.lang.System </b><b>for(m in f) print(m); // Выведет члены экземпляра java.io.File</b><b>// Обратите внимание, что таким способом нельзя перечислить классы в пакете </b><b>for (с in java.lang) print(c): // Этот прием не сработает</b>Rhino позволяет программам на языке JavaScript получать и изменять значения элементов Java-массивов, как если бы они были JavaScript-массивами. Конечно, Java-массивы отличаются от JavaScript-массивов: они имеют фиксированную длину, их элементы имеют определенный тип, и они не имеют JavaScript-методов, таких как
<b>slice()</b><b>// Создать массив из 10 строк и массив из 128 байтов</b><b>var words = java.lang.reflect.Array.newlnstance(java.lang.String, 10);</b><b>var bytes = java.lang.reflect.Array.newlnstance(java.lang.Byte.TYPE, 128);</b><b>// После создания с массивами можно работать как с JavaScript-массивами: </b><b>for(var і = 0; і < bytes.length; i++) bytes[i] = i;</b>Программирование на языке Java часто связано с реализацией интерфейсов. Чаще всего с этой необходимостью приходится сталкиваться при разработке графических интерфейсов, когда каждый обработчик события должен реализовать интерфейс приемника событий. Следующие примеры демонстрируют, как это сделать:
<b>// Интерфейсы: Реализация интерфейсов выглядит следующим образом: </b><b>var handler = new java.awt.event.FocusListener({</b><b> focusGained: function(e) { printfgot focus"); },</b><b> focusLost: function(e) { print("lost focus"): }</b><b>}):</b><b>// Аналогично выполняется расширение абстрактных классов </b><b>var handler = new java.awt.event.WindowAdapter({</b><b> windowclosing: function(e) { java.lang.System.exit(0); }</b><b>}):</b><b>// Когда интерфейс определяет единственный метод, можно использовать простую функцию</b><b>button.addActionListener(function(e) { print("button clicked"); });</b><b>// Если все методы интерфейса или абстрактного класса имеют одну и ту же сигнатуру,</b><b>// в качестве реализации можно использовать единственную функцию,</b><b>// a Rhino будет передавать ей имя метода в последнем аргументе </b><b>frame.addWindowListener(function(e, name) {</b><b> if (name === "windowclosing") java.lang.System.exit(0);</b><b>});</b><b>// Если необходимо определить объект, реализующий несколько интерфейсов,</b><b>// можно использовать класс JavaAdapter:</b><b>var о = new JavaAdapter(java.awt.event.ActionListener, java.lang.Runnable, {</b><b> run: function() {}. // Реализует интерфейс Runnable</b><b> actionPerformed: function(e) {} // Реализует интерфейс ActionListener</b><b>});</b>Когда Java-метод возбуждает исключение, интерпретатор Rhino продолжает его распространение как JavaScript-исключения. Получить оригинальный Java-объект java.lang.Exception можно через свойство javaException JavaScript-объекта Error:
<b>try {</b><b> java.lang.System.getProperty(null); // null - недопустимый аргумент</b><b>}</b><b>catch(e) { // e - JavaScript-исключение</b><b> print(e.javaException); // это обертка для java.lang.NullPointerException</b><b>}</b>Здесь необходимо сделать последнее замечание по поводу преобразования типов в Rhino. Интерпретатор Rhino автоматически преобразует простые числа, логические значения и null. Java-тип char интерпретируется в языке JavaScript как число, так как в языке JavaScript отсутствует символьный тип. JavaScript-строки автоматически преобразуются в Java-строки, но (и это может быть камнем преткновения) Java-строки остаются объектами
<b>java.lang.String</b>