Función: JavaVolver

Descripción

Ejecuta métodos estáticos de clases Java que acepten como parámetros y devuelvan principalmente tipos primitivos.

Las clases accesibles inicialmente son: java.lang.StrictMath, java.lang.Math, java.lang.Byte, java.lang.Short, java.lang.Integer, java.lang.Long, java.lang.Float, java.lang.Double, java.lang.Boolean, java.lang.Character, y jme.JMEMath

El uso de esta función requiere de algún conocimiento previo de Java.

Esta función puede sufrir modificaciones en futuras versiones

Para desarrolladores

■ Las clases permitidas se encuentran dentro de un conjunto accesible mediante el método jme.funciones.Java#getClassSet.
Se pueden añadir o eliminar clases accesibles modificando este conjunto, pero se debe tener precaución en que clases y métodos son accesibles por el usuario, por ejemplo:
    JME → java('java.lang.System.exit(i)',-1) (el usuario provocaría la finalización de la aplicación desde JME sin ninguna forma de control como la salvaguarda de datos)
    JME → java('MiPaquete.MiClase.borrarDatosServidor') (el usuario borraría los datos del servidor suponiendo que hubiera un método así en la aplicación)

Ejemplo de llamada:

jme.funciones.Java.getClassSet().add( String.class );

■ También pueden añadirse métodos estáticos accesibles sin incluir toda la clase mediante el método jme.funciones.Java#getMethodSet.

Ejemplo:

static class Test
{
	// Método a llamar desde JME dentro de una clase estática
	/**
	* Devuelve la longitud de las cadenas en un array
	*/
	static int[] longitudes( String[] array )
	{
		int[] r = new int[ array.length ];
		for ( int i = 0; i < array.length; i++ )
			r[i] = array[i].length();
		return r;
	}
}

// autorizar método
try
{
  	jme.funciones.Java.getMethodSet().add( ejemplos.Ejemplos.Test.class.getDeclaredMethod( "longitudes", new Class<?>[] { String[].class } ) );
}
catch ( NoSuchMethodException e ) { /*...*/ }

java('ejemplos.Ejemplos$Test.longitudes(S)',['Hola',' ','Mundo'])

VectorEvaluado: [4,1,5]


La llamada se puede simplificar usando funciones definidas por el usuario:

Expresion.nuevaFuncion( "longitudes(cadenas):=java('ejemplos.Ejemplos$Test.longitudes(S)',cadenas)" );

longitudes('Hola',' ','Mundo')

VectorEvaluado: [4,1,5]


■ El método estático jme.funciones.Java#setSeguro permite utilizar los métodos estáticos de cualquier clase independientemente del conjunto de clases y métodos estableciendo el valor de true (por defecto) a false.

Ejemplo de llamada:

jme.funciones.Java.setSeguro(false);

■ Los métodos llamados deben incluir el nombre completo (paquetes/subpaquetes/clases externas/...) excepto una clase por defecto que inicialmente es la clase StrictMath. Solo es necesario usar el nombre del método en la llamada:

java('sqrt(d)',16)

RealDoble: 4

java('IEEEremainder(d,d)',15,4)

RealDoble: -1

El método estático jme.funciones.Java#setDefaultClass permite modificar la clase por defecto.

Ejemplo de llamada:

jme.funciones.Java.setDefaultClass( Math.class );

Cadena de entrada

java

Cadena de salida

JAVA

Uso

java(<declaración>[,<param>]*)

Parámetros
# Parámetro Descripción Valor por defecto
1 declaración Declaración de la función a llamar en la forma <nombre_canonico_clase>.<método>(<tipo_param>*).
El tipo de los parámetros formales especifica como se convertirán los parámetros reales:
■ d: Número JME a double
■ f: Número JME a float
■ l: Número JME a long
■ i: Número JME a int
■ n: Número JME a BigInteger
■ x: Número JME a BigDecimal
■ b: Booleano JME a boolean
■ f: Número JME a float
■ s: Texto JME a String
■ c: Texto (primer carácter) JME a char
■ m: Diccionario JME a Map<Object,Object>
■ o: Cualquier terminal JME a Object
tipos anteriores en mayúscula: Vector JME a array del tipo indicado

Ejemplo: 'java.lang.Math.max(d,d)'
2+ param Parámetros reales del método

Valor devuelto

Ejemplos

java('min(l,l)',76,-4)

EnteroGrande: -4

java('random') método sin parámetros

RealDoble: 0.9880752819829501

java('java.lang.Long.decode(s)','0xFF')

EnteroGrande: 255

java('java.lang.Long.toOctalString(l)',long_max_value)

Texto: '777777777777777777777'

java('java.lang.Long.rotateLeft(l,i)',5,2)

EnteroGrande: 20

enterogrande(java('java.lang.Float.floatToRawIntBits(f)',pi))

EnteroGrande: 1078530011

java('java.lang.Double.doubleToRawLongBits(d)',pi)

EnteroGrande: 4614256656552045848

java('java.lang.Character.isISOControl(c)',chr(27))

Booleano: verdadero

mínimo común múltiplo en la clase Util con array de BigInteger:

public static BigInteger lcm( BigInteger... nums )

java('jme.Util.lcm(N)',[200b#,3211,1111])

EnteroGrande: 101398986541885000192239588382287580396943958268746162286209422173290649970141110530


módulo de un array de doubles en la clase Util:

public static double mod( double... vx )

java('jme.Util.mod(D)',[3,1,pi,_e,phi,0,3.25])

RealDoble: 6.359181904047871

método definido por el usuario, que utiliza un tipo JME (Complejo):

/* ... */
jme.funciones.Java.getClassSet().add( MiClase.class );
/* ... */

// intercambiar parte real e imaginaria
static Complejo swapComplejo( Complejo z )
{
    return new Complejo( z.im(), z.re() );
}

java('MiClase.swapComplejo(o)',3-2ui)

Complejo: -2+3I

Desde / Última modificación

v0.4.3

v0.4.6

Véase también…

jconst