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