A.4.2如何在Octave中使用Java

函数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,可以检查avariable是否是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未转换为Octavedouble,从创建时javaObject。但是,如果Java类java.lang.Doubledouble是方法(或构造函数)的参数。在这种情况下,它们可以相互转换,具体取决于上下文。

通过javaObject可以创建除了数组之外的所有类型的Java对象。后者是通过创建的javaArray.

可以用Java语法在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类型之间自动转换。对于函数,返回值也是如此,而对于构造函数,则不然。

也可以使用Java语法从Octave中访问Java对象的公共字段,但受静态字段的限制:

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

因此,与java_set可以设置字段的值。请注意,只有公共Java字段可以从内部访问。

以下示例表明,在Octave中的空括号[]代表Javanull值以及Java异常的表示方式。

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

不建议表示Java的null空括号中的值[]因为null没有类型,而[]具有类型double.

在Octave中,可以通过列出Java对象的公共字段和方法(静态或非静态)来提供有限的Java反射。

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

最后,给出了一个示例,说明如何从withinOcve访问堆栈跟踪,其中函数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"))

版权所有 © 2024-2025 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2