Взаимодействие JavaScript и Java
Если вы ссылаетесь на пакет или класс
Java или работаете с объектом или массивом
Java, вы используете один из специальных объектов
LiveConnect. Весь доступ
JavaScript к
Java осуществляется через эти объекты, резюме по которым – в следующей таблице.
Объект | Описание |
JavaArray | Обёрнутый массив Java, к которому имеется доступ из кода JavaScript. |
JavaClass | Ссылка JavaScript на Java-класс. |
JavaObject | Обёрнутый объект Java, к которому имеется доступ из кода JavaScript. |
JavaPackage | Ссылка JavaScript на Java-пакет. |
Примечание
Поскольку
Java является строго типизированным языком, а
JavaScript типизирован слабо, машина выполнения
JavaScript конвертирует значения аргументов в типы данных, подходящие для других языков, если вы используете
LiveConnect.
Иногда существование объектов
LiveConnect достаточно прозрачно, поскольку вы взаимодействуете с
Java в довольно интуитивной манере. Например, вы можете создать объект
Java String и присвоить его в
JavaScript переменной
myString путём использования оператора
new с конструктором
Java таким вот образом:
var myString = new java.lang.String("Hello world")
Здесь переменная
myString является
JavaObject, поскольку она содержит экземпляр
Java-объекта
String. Как
JavaObject,
myString имеет доступ к
public-методам экземпляра
java.lang.String и его суперкласса,
java.lang.Object. Эти
Java-методы доступны в
JavaScript как методы из
JavaObject, и вы можете вызывать их так:
Объект Packages
Если
Java-класс не является частью пакетов
java,
sun или
netscape, вы можете получить к нему доступ через объект
Packages. Например, предположим, корпорация
Redwood использует
Java-пакет под названием
redwood как контейнер различных
Java-классов. Чтобы создать экземпляр класса
HelloWorld из
redwood, вы осуществляете доступ к конструктору класса так:
var red = new Packages.redwood.HelloWorld()
Вы можете также иметь доступ к классам в пакете по умолчанию (то есть к классам, не указывающим пакет явно). Например, если класс
HelloWorld находится непосредственно в пути
CLASSPATH, а не в пакете, вы можете получить к нему доступ так:
var red = new Packages.HelloWorld()
Объекты
LiveConnect java,
sun и
netscape являются аббревиатурами для наиболее часто употребляющихся
Java-пакетов. Например:
var myString = new java.lang.String("Hello world")
вместо более длинной версии:
var myString = new Packages.java.lang.String("Hello world")
Работа с Массивами Java
Если любой
Java-метод создаёт массив и вы ссылаетесь на этот массив в
JavaScript, вы работаете с
JavaArray. Например, следующий код создаёт
JavaArray x из 10 элементов типа
int:
x = java.lang.reflect.Array.newInstance(java.lang.Integer, 10)
Как и объект
Array из
JavaScript,
JavaArray имеет свойство
length, которое возвращает количество элементов массива. В отличие от
Array.length,
JavaArray.length, это свойство только для чтения, поскольку количество элементов
Java-массива фиксируется в момент создания.
Ссылки на Пакеты и Классы
Простые ссылки из
JavaScript на пакеты и классы
Java создают объекты
JavaPackage и
JavaClass. В предыдущем примере о компании
Redwood, к примеру, ссылка
Packages.redwood это
JavaPackage-объект. Аналогично ссылка
java.lang.String является
JavaClass-объектом.
В большинстве случаев вам не нужно беспокоиться об объектах
JavaPackage и
JavaClass – вы просто работаете с пакетами и классами
Java, а
LiveConnect создаёт эти объекты прозрачно.
В
JavaScript 1.3 и ранее
JavaClass-объекты не конвертируются автоматически в экземпляры
java.lang.Class. Если вы передаёте их в качестве параметров
Java-методам – вы обязаны создавать wrapper/оболочку вокруг экземпляра
java.lang.Class. В следующем примере метод
forName создаёт объект-оболочку
theClass, который затем передаётся методу
newInstance для создания массива.
theClass = java.lang.Class.forName("java.lang.String")
theArray = java.lang.reflect.Array.newInstance(theClass, 5)
В
JavaScript 1.4 и позднее вы можете передавать
JavaClass-объект непосредственно в метод, как в следующем примере:
theArray = java.lang.reflect.Array.newInstance(java.lang.String, 5)
Аргументы Типа char
В
JavaScript 1.4 и позднее вы можете передавать строку из одного символа в
Java-метод, который требует аргумент типа
char. Например, вы можете передать строку
H в конструктор
Character:
c = new java.lang.Character("H")
В
JavaScript 1.3 и ранее вы обязаны передавать в такие методы целое число, соответствующее
Unicode-значению символа. Например, следующий код также присваивает значение
H переменной
c:
c = new java.lang.Character(72)
Обработка Исключений Java в JavaScript
Если код
Java прерывается на этапе прогона программы, он вызывает исключение. Если Ваш
JavaScript-код имеет доступ к члену данных
Java или методу и терпит неудачу, исключение
Java передаётся в
JavaScript для обработки. Начиная с
JavaScript 1.4, вы можете отловить это исключение в операторе
try...catch.
Например, предположим, вы используете
Java-метод
forName для присвоения имени
Java-класа переменной
theClass. Метод
forName вызывает исключение, если передаваемое вами значение не вычисляется в имя
Java-класса. Поместите оператор присвоения
forName в блок
try для обработки исключения:
function getClass(javaClassName) {
try {
var theClass = java.lang.Class.forName(javaClassName);
} catch (e) {
return ("The Java exception is " + e);
}
return theClass
}
В этом примере, если
javaClassName вычисляется в верное имя класса, такое как
java.lang.String, присвоение проходит успешно. Если
javaClassName вычисляется в неверное имя класса, такое как
String, функция
getClass отлавливает исключение и возвращает нечто подобное:
The Java exception is java.lang.ClassNotFoundException: String