函数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