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 можно установить значение поля. Обратите внимание, что из Octave доступны только публичные поля 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–2023 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.2.0/How-to-use-Java-from-within-Octave.html