Spec-Zone.ru › Octave 9

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 не преобразуется в double Octave, если создано с помощью javaObject. Однако могут возникнуть неоднозначности, если классы Java java.lang.Double или double используются в качестве параметров метода (или конструктора). В этом случае они могут преобразовываться друг в друга в зависимости от контекста.

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

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

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

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

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

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

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

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

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

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

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

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

Не рекомендуется представлять значение null в Java пустыми скобками [], поскольку 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–2026 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/v9.4.0/How-to-use-Java-from-within-Octave.html

Spec-Zone.ru

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