invoke()

La función de sistema JavaLib.invoke invoca un método en un objeto o clase Java nativa y puede devolver un valor. La función JavaLib.invoke es una de las diversas funciones de acceso Java.

  JavaLib.invoke(
    identificadorOClase javaObjIdOrClass in,
    método STRING in
    {, argumento anyEglPrimitive in})
  returns (resultado anyJavaPrimitive)
resultado
El campo de retorno, si está presente, recibe un valor del método nativo Java.

Si el método nativo Java devuelve un valor, el campo de resultado es opcional.

Se aplican las siguientes normas:

  • Si el valor devuelto es BigDecimal, BigInteger, byte, short, int, long, float o double, el campo de resultado debe ser un tipo de datos numérico. Las características no necesitan coincidir con el valor; por ejemplo, un tipo float puede almacenarse en un campo de resultado declarado sin dígitos decimales. Para obtener detalles acerca del manejo del desbordamiento, consulte VGVar.handleOverflow y SysVar.overflowIndicator.
  • Si el valor devuelto es de tipo booleano, el campo de resultado debe ser de tipo primitivo numérico. El valor es 1 para true y 0 para false.
  • Si el valor devuelto es una matriz de bytes, el campo de resultado debe ser de tipo HEX. Para obtener detalles acerca de la discrepancia de longitudes, consulte el tema Asignaciones.
  • Si el valor devuelto es un de tipo String o char, el campo de resultado debe ser de tipo CHAR, DBCHAR, MBCHAR, STRING o UNICODE--
    • Si el campo de resultado es de tipo MBCHAR, STRING o UNICODE, el valor devuelto es siempre adecuado
    • Si el campo de resultado es de tipo CHAR, pueden producirse problemas si el valor devuelto incluye caracteres que corresponden a caracteres DBCHAR
    • Si el campo es de tipo DBCHAR, pueden producirse problemas si el valor devuelto incluye caracteres Unicode que corresponden a caracteres de un solo byte

    Para obtener detalles acerca de la discrepancia de longitudes, consulte el tema Asignaciones.

  • Si el método nativo Java no devuelve ningún valor o devuelve un nulo, se aplican las siguientes normas:
    • No se produce ningún error en ausencia de un campo de resultado
    • Se produce un error durante la ejecución si está presente un campo de resultado; el error es el 00001004, como se indica más adelante
identificadorOClase
Este argumento es una de las siguientes entidades:
  • Un identificador que hace referencia a un objeto del espacio de objetos; o
  • El nombre totalmente calificado de una clase Java.

Este argumento es un literal de serie o una variable de tipo CHAR, DBCHAR, MBCHAR, STRING o UNICODE. Si especifica un identificador de un objeto, el identificador debe haberse convertido temporalmente a objID, como en el ejemplo que figura más adelante. EGL elimina blancos de un solo byte y de doble byte del principio y el final del valor del argumento, que es sensible a mayúsculas y minúsculas.

El código no puede invocar un método en un objeto hasta que el usuario ha creado un identificador para el objeto. Un ejemplo que figura más adelante ilustra este punto con java.lang.System.out, que hace referencia a un objeto PrintStream.

método
El nombre del método al que debe llamarse.

Este argumento es un literal de serie o una variable de tipo CHAR, DBCHAR, MBCHAR, STRING o UNICODE. Se eliminan blancos de un solo byte y de doble byte del principio y el final de la serie, que es sensible a mayúsculas y minúsculas.

argumento
Un valor pasado al método.

Puede ser necesaria una conversión temporal, como se especifica en el apartado Acceso Java (palabras del sistema).

Se aplican las normas de conversión de tipos Java. Por ejemplo, no se produce ningún error si se pasa un tipo short a un parámetro de método declarado como int.

Para evitar perder precisión, utilice un campo float EGL para un double Java y un campo smallfloat EGL para un float Java. Si utiliza otro de los tipos EGL, probablemente se redondeará un valor.

El área de memoria del programa invocante no cambia, independientemente de la acción realizada por el método.

En el ejemplo siguiente, es necesaria la conversión temporal (objId) excepto cuando se indica:
  // llamar al constructor de la clase Java Date y
  // asignar el objeto nuevo al identificador "date".
  JavaLib.storeNew( (objId)"date", "java.util.Date");

  // llamar al método toString del objeto nuevo Date
  // y asignar la salida (fecha de hoy) a chaItem.
  // En ausencia de la conversión temporal (objId), "date" 
  // hace referencia a una clase en lugar de a un objeto.
  chaItem = JavaLib.invoke( (objId)"date", "toString" );

  // asignar la corriente de salida estándar de la 
  // clase Java System al identificador "systemOut".
  JavaLib.storeField( (objId)"systemOut", "java.lang.System", "out" );

  // llamar al método println de la corriente de 
  // salida e imprimir la fecha de hoy.
  JavaLib.invoke( (objID)"systemOut", "println", chaItem );

  // La utilización de "java.lang.System.out" como primer 
  // argumento en la línea anterior no habría sido
  // válida, ya que el argumento debe ser un 
  // identificador que ya se encuentre en el espacio de objetos
  // o un nombre de clase. El argumento no puede hacer referencia a un campo estático.

Un error producido durante el proceso de JavaLib.invoke puede establecer SysVar.errorCode en uno de los valores que figuran en la tabla siguiente.

Valor de SysVar.errorCode Descripción
00001000 Un método invocado ha lanzado una excepción o como resultado de una inicialización de clase.
00001001 El objeto era nulo o el identificador especificado no estaba en el espacio de objetos
00001002 No existe o no puede cargarse un método, campo o clase públicos con el nombre especificado
00001003 El tipo primitivo EGL no coincide con el tipo esperado en Java
00001004 El método ha devuelto nulo, no devuelve ningún valor o el valor de un campo era nulo
00001005 El valor devuelto no coincide con el tipo de la variable de retorno
00001006 No ha podido cargarse la clase de una conversión temporal de argumento a nulo
00001007 Se ha lanzado una excepción de tipo SecurityException o IllegalAccessException durante un intento de obtener información acerca de un método o campo; o se ha intentado establecer el valor de un campo declarado como final
00001009 Debe especificarse un identificador en lugar de un nombre de clase; el método o campo no es estático

Conceptos relacionados

Tareas relacionadas
Diagrama de sintaxis para sentencias y mandatos EGL

Consulta relacionada
Asignaciones
BIN y los tipos enteros (integer)
Biblioteca JavaLib de EGL
Manejo de excepciones

getField()
isNull()
isObjID()
qualifiedTypeName()
remove()
removeAll()
setField()
store()
storeCopy()
storeField()
storeNew()
Tipos primitivos
overflowIndicator
handleOverflow

Condiciones de uso | Comentarios
(C) Copyright IBM Corporation 2000, 2005. Reservados todos los derechos.