Ejemplo: Aplicación de cliente ActiveX que llama a métodos Java
En el puente de ActiveX a EJB (Enterprise Java™ Beans), se llama a los métodos utilizando la sintaxis de invocación de método del lenguaje nativo.
- A diferencia de los métodos Java, ActiveX no tiene soporte para el polimorfismo de métodos (y constructor); es decir, no se pueden tener dos métodos en la misma clase con el mismo nombre.
- Los métodos Java son sensibles a las mayúsculas y minúsculas pero ActiveX Automation no es sensible a las mayúsculas y minúsculas.
Para compensar el comportamiento de polimorfismo de Java, proporcione los tipos de parámetros exactos a la llamada de método. Los tipos de parámetros determinan el método correcto que se ha de invocar. Para obtener una lista de los tipos correctos que se han de utilizar, consulte el tema "Puente de ActiveX a EJB, conversión de tipos de datos".
- Por ejemplo, el siguiente código Visual Basic no se ejecutará correctamente si el método CLng() no está presente o si por error la sintaxis de toHexString se escribe como ToHexString:
... Dim strHexValue as String strHexValue = clsMyString.toHexString(CLng(255))
- Algunas veces, resulta difícil imponer que algunos entornos de desarrollo no modifiquen las mayúsculas y minúsculas de las llamadas a método. Por ejemplo, en Visual Basic si desea llamar a un método close() (en minúsculas), el código Visual Basic lo cambia a mayúsculas, "Close()". En Visual Basic, el único modo de solucionar de forma eficaz este tipo de comportamiento es utilizar el método CallByName(). Por ejemplo:
o.Close(123) 'Incorrect... CallByName(o, "close", vbMethod, 123) 'Correct...
o en VBScript, utilice la función Eval:o.Close(123) 'Incorrect... Eval("o.Close(123)") 'Correct...
- El valor de retorno de una función siempre se convierte dinámicamente en el tipo correcto. Sin embargo, debe prestar atención y utilizar la palabra clave set en Visual Basic. Si espera que se devuelva un tipo de datos no primitivo, deberá utilizar set. (Si espera que se devuelva un tipo de datos primitivo, no es necesario que utilice set). Consulte el ejemplo siguiente para obtener más información:
Set oMyObject = o.getObject iMyInt = o.getInt
En algunos casos, es posible que no sepa cuál es el tipo de objeto devuelto desde una llamada a método, porque las clases wrapper se convierten automáticamente a tipos primitivos (por ejemplo, java.lang.Integer devuelve Long de ActiveX Automation). En estos casos, es posible que necesite utilizar las técnicas de manejo de excepciones incorporadas de su lenguaje para intentar forzar el tipo devuelto (por ejemplo, On Error y Err.Number en Visual Basic).
- Métodos con argumentos de caracteres
Dado que ActiveX Automation no tiene soporte de forma nativa a los tipos de caracteres soportados por los métodos de Java, el puente de ActiveX a EJB utiliza series (byte o VT_I1 no funcionan porque los caracteres tienen muchos bytes en el código Java). Si intenta llamar a un método que toma el tipo char o java.lang.Character, deberá utilizar el contenedor del argumento JMethodArgs para pasar los valores de caracteres a los métodos o constructores. Para obtener más información acerca de cómo se utiliza este contenedor de argumentos, consulte el tema relacionado con Métodos que tienen el tipo "Object" como argumento y argumentos abstractos.
- Métodos que tienen el tipo "Object" como argumento y argumentos abstractos.
Debido al polimorfismo de la programación Java, el puente de ActiveX a Java utiliza la correlación de tipos de argumentos directa para buscar un método. Este método funciona bien en la mayor parte de los casos pero, algunas veces, los métodos se declaran con una clase padre o abstracta como un tipo de argumento (por ejemplo, java.lang.Object). Debe poder enviar un objeto de tipo arbitrario a un método. Para conseguirlo, debe utilizar el objeto XJB.JMethodArgs para forzar los parámetros de modo que coincidan con los parámetros del método. Puede obtener una instancia JMethodArgs utilizando el método JClassFactory.GetArgsContainer().
El objeto JMethodArgs es un contenedor para los parámetros de método o argumentos. Este contenedor permite añadir al mismo un parámetro tras otro cuando envía el objeto JMethodArgs a la llamada al método. Los objetos JClassProxy y JObjectProxy reconocen el objeto JMethodArgs e intentan buscar el método correcto y permiten que el lenguaje Java fuerce correctamente sus parámetros.
Por ejemplo, para añadir un elemento a un objeto Hashtable, la sintaxis del método es Object put(Object key, Object value). En Visual Basic, el uso del método es similar al siguiente código de ejemplo:Dim oMyHashtable as Object Set oMyHashtable = _ oXJB.NewInstance(oXJB.FindClass("java.utility.Hashtable")) ' This line will not work. The ActiveX to EJB bridge cannot find a method ' llamado "put" que tiene short y String como parámetro: oMyHashtable.put 100, "Dogs" oMyHashtable.put 200, "Cats" ' You must use a XJB.JMethodArgs object instead: 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