函数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.Double或double是方法(或构造函数)的参数。在这种情况下,它们可以相互转换,具体取决于上下文。
通过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