Wiki-учебник по веб-технологиям: JavaScript/ВзаимодействиеJavaScriptИJava ...

Главная | Каталог |

Взаимодействие 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, и вы можете вызывать их так:

myString.length() // возвращает 11


Объект 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 для создания массива.

// JavaScript 1.3
theClass = java.lang.Class.forName("java.lang.String")
theArray = java.lang.reflect.Array.newInstance(theClass, 5)


В JavaScript 1.4 и позднее вы можете передавать JavaClass-объект непосредственно в метод, как в следующем примере:

// JavaScript 1.4
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