Spec-Zone.ru › Octave 7

A.4.2 Как использовать Java из Octave

Функция javaObject создает объекты Java. Фактически она вызывает публичный конструктор класса с данным именем и заданными параметрами.

Следующий пример демонстрирует, как вызвать конструкторы BigDecimal(double) и BigDecimal(String) встроенного класса Java java.math.BigDecimal.

javaObject ("java.math.BigDecimal",  1.001 );
javaObject ("java.math.BigDecimal", "1.001");

Обратите внимание, что параметры типа Octave double неявно преобразуются в тип Java double, а тип Octave (массив) char преобразуется в тип Java String. Объект Java, созданный функцией javaObject, никогда автоматически не преобразуется в тип Octave, а остается объектом Java. Он может быть присвоен переменной Octave.

a = 1.001;
b = javaObject ("java.math.BigDecimal", a);

С помощью функции isjava можно проверить, является ли переменная объектом Java, а также определить её класс. В дополнение к предыдущему примеру:

isjava (a)
⇒ ans = 0
class (a)
⇒ ans = double
isjava (b)
⇒ ans = 1
class (b)
⇒ ans = java.math.BigDecimal

Вышеприведенный пример можно выполнить, используя только объекты Java:

a = javaObject ("java.lang.Double", 1.001);
b = javaObject ("java.math.BigDecimal", a);

isjava (a)
⇒ ans = 1
class (a)
⇒ ans = java.lang.Double
isjava (b)
⇒ ans = 1
class (b)
⇒ ans = java.math.BigDecimal

Можно заметить, что даже java.lang.Double не преобразуется в Octave double, когда создается функцией javaObject. Однако могут возникнуть неоднозначности, если классы Java java.lang.Double или double являются параметрами метода (или конструктора). В этом случае они могут быть преобразованы друг в друга в зависимости от контекста.

С помощью javaObject можно создавать всевозможные объекты Java, но не массивы. Последние создаются с помощью javaArray.

Возможен вызов публичных методов членов объектов Java в синтаксисе Java:

a.toString
⇒ ans = 1.001
b.toString
⇒ ans = 1.000999999999999889865...

Второй результат может быть неожиданным, но просто происходит из-за того, что 1.001 не может быть точно представлен как double из-за округления. Обратите внимание, что в отличие от Java, в Octave методы без аргументов можно вызывать с и без скобок ().

В настоящее время невозможно вызывать статические методы с синтаксисом Java из Octave. Вместо этого необходимо использовать функцию javaMethod, как в следующем примере:

java.math.BigDecimal.valueOf(1.001);                    # does not work
javaMethod ("valueOf", "java.math.BigDecimal", 1.001);  # workaround

Как упоминалось ранее, параметры методов и конструкторов автоматически преобразуются между типами Octave и Java, если это уместно. Для функций это также верно для возвращаемых значений, в то время как для конструкторов — нет.

Также можно получить доступ к публичным полям объектов Java из Octave, используя синтаксис Java, с ограничением на статические поля:

java.math.BigDecimal.ONE;                  # does not work
java_get ("java.math.BigDecimal", "ONE");  # workaround

Соответственно, с помощью java_set можно установить значение поля. Обратите внимание, что доступны только публичные поля Java из Octave.

Следующий пример демонстрирует, как в Octave пустые скобки [] представляют значение Java null и как обрабатываются исключения Java.

javaObject ("java.math.BigDecimal", []);
⇒ error: [java] java.lang.NullPointerException

Не рекомендуется представлять значение Java null с помощью пустых скобок [], поскольку null не имеет типа, в то время как [] имеет тип double.

В Octave можно ограниченно использовать рефлексию Java, перечисляя публичные поля и методы объекта Java, как статические, так и нет.

fieldnames (<Java object>)
methods (<Java object>)

Наконец, показан пример доступа к трассировке стека из Octave, где функция debug_java используется для установки и получения текущего состояния отладки. В режиме отладки отображаются ошибка Java и трассировка стека.

debug_java (true)  # use "false" to omit display of stack trace
debug_java ()
⇒ ans = 1
javaObject ("java.math.BigDecimal", "1") ...
  .divide (javaObject ("java.math.BigDecimal", "0"))

© 1996–2022 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v7.2.0/How-to-use-Java-from-within-Octave.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API