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…