示例:ActiveX 客户机应用程序调用 Java 方法
在 ActiveX to Enterprise Java™ Bean (EJB) 网桥中,使用本机语言方法调用语法调用方法。
- 和 Java 方法不同,ActiveX 不支持方法(和构造函数)多态性;就是说,不能在同一类中存在相同名称的两种方法。
- Java 方法区分大小写,但 ActiveX Automation 不区分大小写。
要补偿 Java 的多态性行为,请给出方法调用的准确的参数类型。参数类型确定调用正确的方法。对于要使用的正确类型列表,请参阅 ActiveX 到 EJB 网桥,转换数据类型。
- 例如,如果 CLng() 方法不存在或者将 toHexString 语法错误地输入为 ToHexString,那么以下 Visual Basic 代码失败:
... Dim strHexValue as String strHexValue = clsMyString.toHexString(CLng(255))
- 有时很难强迫一些开发环境保留您方法调用的情况保持不变。例如,在 Visual Basic 中,如果您要调用方法 close()(小写),那么 Visual Basic 代码将其大写为“Close()”。在 Visual Basic 中,唯一能够有效地解决此行为的方法是使用 CallByName() 方法。例如:
o.Close(123) 'Incorrect... CallByName(o, “close”, vbMethod, 123) 'Correct...
or in VBScript, use the Eval function:o.Close(123) 'Incorrect... Eval(“o.Close(123)”) 'Correct...
- 函数的返回值总是动态地转换为正确类型。然而,您必须注意使用 Visual Basic 中的 set 关键字。 如果您要返回非基本数据类型,那么您必须使用 set。(如果您要返回基本数据类型,那么无需使用 set。)请参阅以下示例以获取更多说明信息:
Set oMyObject = o.getObject iMyInt = o.getInt
在某些情况下,您可能不知道会从方法调用返回何种类型的对象,因为捆绑类自动转换为基本(例如,java.lang.Integer 返回 ActiveX Automation 长度)。在这样的情况下,您可能需要使用语言的内置异常处理技术,以尝试强制返回的类型(例如,Visual Basic 中的 On 错误和 Err.Number 错误)。
- 带有字符自变量的方法
因为 ActiveX Automation 不能本机支持 Java 方法支持的字符类型,所以 ActiveX to EJB 网桥使用字符串(字节或 VT_I1 无效,因为 Java 代码中的字符包含多个字节)。如果您尝试调用采用字符或 java.lang.Character 类型的方法,那么您必须使用 JMethodArgs 自变量容器将传递字符值传递到方法或构造函数。有关如何使用此自变量容器的更多信息,请参阅“对象”类型作为自变量和抽象自变量的方法。
- “对象”类型作为自变量和抽象自变量的方法
因为 Java 编程的多态本性,ActiveX to Java 网桥使用直接自变量类型映射查找方法。大多数情况下,此方法使用良好,除了有时用 Parent 类或 Abstract 类作为自变量类型(例如,java.lang.Object)声明方法。您需要将任意类型的对象发送到方法。要获取此功能,您必须使用 XJB.JMethodArgs 对象使参数与方法上的参数强制匹配。您可以通过使用 JClassFactory.GetArgsContainer() 方法获取 JMethodArgs 实例。
JMethodArgs 对象是方法参数或自变量的容器。 此容器使您能将参数逐一添加,然后您可以将 JMethodArgs 对象发送到方法调用。JClassProxy 和 JObjectProxy 对象识别 JMethodArgs 对象,并试图查找正确方法,使 Java 语言强制参数适用。
例如,要将元素添加到 Hashtable 对象,那么方法语法是对象放置(对象密钥、对象值)。在 Visual Basic 中,方法用法类似于以下示例代码:Dim oMyHashtable as Object Set oMyHashtable = _ oXJB.NewInstance(oXJB.FindClass(“java.utility.Hashtable”)) ' 此行不工作。ActiveX 到 EJB 网桥无法查找方法,称为“put”,有短和字符串作为参数: ' 调用具有作为参数的简短字符串的“put”: oMyHashtable.put 100, “Dogs” oMyHashtable.put 200, “Cats” ' 您必须使用 XJB.JMethodArgs 对象: Dim oMyHashtableArgs as Object Set oMyHashtableArgs = oXJB.GetArgsContainer oMyHashtableArgs.AddObject(“java.lang.Object”, 100) oMyHashtableArgs.AddObject(“java.lang.Object”, “Dogs”) oMyHashtable.put oMyHashTableArgs ' Reuse the same JMethodArgs object by clearing it. oMyHashtableArgs.Clear oMyHashtableArgs.AddObject(“java.lang.Object”, 200) oMyHashtableArgs.AddObject(“java.lang.Object”, “Cats”) oMyHashtable.put oMyHashTableArgs