Spec-Zone.ru › Octave 5

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 пустые скобки [] представляют значение 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/v5.2.0/How-to-use-Java-from-within-Octave.html

Spec-Zone.ru

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