jueves, octubre 07, 2010

Uso de reflexión para evaluar funciones matemáticas

Continuando con el uso del paquete java.lang.reflect, en este programa se muestra una forma fácil de invocar una función cualquiera de la clase java.lang.Math solicitada por el usuario en tiempo de ejecución.

El programa pregunta por pantalla la expresión matemática y, haciendo uso de la funcionalidad de expresiones regulares de java, verifica que la expresión esté bien escrita, que el método solicitado esté en la clase java.Math y que el argumento entre paréntesis sea un número.


import java.lang.reflect.*;
import static javax.swing.JOptionPane.*;


public class TestReflect {
    public static void main(String[] args) {
        ejecutarMetodoMatematico();
    }

    public static void ejecutarMetodoMatematico(){
        String cadena;
        String[] elem;
        boolean  valido=false;
        do {
            cadena = showInputDialog("Función matematica");
            if(cadena==null) break;
            if(!cadena.matches("\\w \\s*\\(\\s*\\-?\\d (\\.\\d )?\\s*\\)\\s*")){
                mostrarError("Cadena no permitida");
                continue;
            }
            elem   = cadena.split("\\(|\\)");
            elem[0] = elem[0].trim();
            elem[1] = elem[1].trim();
            if(elem.length!=2) {
                mostrarError("Cadena no valida");
                continue;
            }
            Class c = java.lang.Math.class;
            Method m;
            try {
                m = c.getMethod(elem[0], Double.TYPE);
            }
            catch(NoSuchMethodException x) {
                mostrarError("Metodo '" elem[0] "' no permitido");
                continue;
            }
            if(!elem[1].matches("\\-?\\d (\\.\\d*)?")) {
                mostrarError("Numero '" elem[1] "' no es valido");
                continue;
            }
            valido = true;
            double num = Double.parseDouble(elem[1]);
            try {
                Object respuesta = m.invoke(null, num);
                mostrarRespuesta(cadena " = "  respuesta);
            }
            catch(IllegalAccessException x) { x.printStackTrace(); }
            catch(InvocationTargetException x) { x.printStackTrace(); }
        } while(!valido);
    }

    public static void mostrarError(String msg) {
        showMessageDialog(null, msg, "Error", ERROR_MESSAGE);
    }

    public static void mostrarRespuesta(String msg) {
        showMessageDialog(null, msg, "Solución", PLAIN_MESSAGE);
    }
}

1 comentario:

Multiprocesamiento recursivo en JAVA 7

Una de las estrategias de diseño de algoritmos más comunes es la de "divide y vencerás", en la cual, un problema de tamaño relativ...