A.4.2如何在Octave中使用Java

函数javaObject创建Java对象。事实上,它调用具有给定名称和给定参数的类的公共构造函数。

以下示例显示如何调用构造函数BigDecimal(双精度)BigDecimal(字符串)内置Java类的java.math。BigDecimal.

javaObject(“java.math.BigDecimal”,1.001);javaObject(“java.math.BigDecimal”,“1.001”);

请注意,Octave类型的参数double隐式转换为Java类型double和Octave类型(的数组)char已转换为java类型一串。从创建的Java对象javaObject从不自动转换为Octave类型,而是保留为Java对象。它可以指定给Octave变量。

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

使用isjava,可以检查avariable是否是Java对象,也可以确定其类。除了前面的例子:

isjava(a)⇒ ans=0类(a)⇒ ans=doubleisjava(b)⇒ ans=1类(b)⇒ ans=java.math。BigDecimal

上面的示例只能使用Java对象来执行:

a=javaObject(“java.lang.Double”,1.001);b=javaObject(“java.math.BigDecimal”,a);isjava(a)⇒ ans=1类(a)⇒ ans=java.lang.Doubleisjava(b)⇒ ans=1类(b)⇒ ans=java.math。BigDecimal

人们可以看到,即使是java.lang.双未转换为Octavedouble,从创建时javaObject。但是,如果Java类java.lang.双double是方法(或构造函数)的参数。在这种情况下,它们可以相互转换,具体取决于上下文。

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

可以用Java语法在Java对象上调用公共成员方法:

a.toString⇒ ans=1.001b.to字符串⇒ ans=1.0009999999999889865。。。

第二个结果可能令人惊讶,但只是因为事实1.001不能准确地表示为double,从于舍入。注意,与Java中不同的是,在Octave中,不带参数的方法可以用括号和不带括号调用().

目前,在Octave中不可能使用类似Java的语法来调用静态方法。相反,必须使用函数javaMethod如下例所示:

java.math。BigDecimal.valueOf(1.001);#不起作用javaMethod(“valueOf”,“java.math.BigDecimal”,1.001);#变通方法

如前所述,如果合适的话,方法和构造函数参数会在Octave和Java类型之间自动转换。对于函数,返回值也是如此,而对于构造函数,则不然。

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

java.math。BigDecimal。一;#不工作java_get(“java.math.BigDecimal”,“ONE”);#变通方法

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

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

javaObject(“java.math.BigDecimal”,[]);⇒ 错误:[java]java.lang.NullPointerException

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

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

fieldname(<Java object>)方法(<Java object>)

最后,给出了一个示例,说明如何从withinOcve访问堆栈跟踪,其中函数调试_java用于设置和获取当前调试状态。在调试模式下,将显示Java错误和堆栈跟踪。

debug_java(true)#使用“false”省略堆栈tracedebug_java的显示()⇒ ans=1javaObject(“java.math.BigDecimal”,“1”)。divide(javaObject(“java.math.BigDecimal”,“0”)

版权所有 © 2024 Octave中文网

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