Reflexión: determine el método para llamar y parámetros a partir de un valor de base de datos

Desarrollé un sistema POS simple que obtiene la lista de productos y botones de la base de datos. La tabla que contiene todos los botones proporciona toda la información que necesitamos para dibujar el botón (es decir, tamaño, posición, etiqueta, color y con qué SKU se relaciona).

En la versión original, todos los botones de 'función' se han codificado de forma rígida (es decir, números del 1 al 9, pagar, cambiar los niveles de precio, finalizar el turno, etc.) pero quiero pasar a un diseño más personalizable, de modo que los botones de función también puedan almacenarse en la base de datos.

Estaba pensando en hacer esto con algo basado en la reflexión. Tengo una clase que actúa como interfaz, que contiene todos los métodos que aparecerán en la base de datos, que luego llamarán a cualquiera de los métodos necesarios dentro del sistema. Pero no estoy seguro de cómo mapear esto en la base de datos.

Estoy bastante seguro de que cada método tomará 0, 1 o 2 parámetros que tienen una mezcla de boolean, int, double y char.

Se me ocurrió una notación para la base de datos que puedo analizar para determinar toda la información que necesito para llamar al método, por ejemplo, para pagar una venta, pondría algo como

paySale[]

en la base de datos, pero si el cliente me dio $ 50 y yo quisiera usar un botón de 'efectivo rápido', entonces la llamada al método sería

paySale[d 50]

o algo un poco más complejo, como pagar con cheque

paySale[i 3, d 50]

donde int es el tipo de método de pago (en este caso sería check) y double es el total.

Mi problema es que cuando trato de buscar el método usando getMethod () no puedo averiguar cómo definir qué parámetros buscar, como double.class e int.class

Habrá varios métodos diferentes que deberán llamarse para manejar cosas como cambios de nivel de precios, fin de turno, pago a cuentas / pestañas, etc., así que si hay una manera más fácil de hacer esto, ¡entonces estoy abierto a ello!

Gracias de nuevo chicos!

preguntado el 08 de noviembre de 11 a las 15:11

2 Respuestas

Usa algo como

class.getMethod(int.class, double.class, String.class) etc. Si su método no es de uso público getDeclaredMethod() en vez.

Pero, sinceramente, tu solución suena extraña. Por lo que tengo entendido, en realidad guardas en una especie de script DB y luego lo ejecutas. Si es así, utilice el motor de secuencias de comandos listo para usar. Por ejemplo, java 1.6 y superior tiene un intérprete de JavaScript incorporado (consulte ScriptEngineManager). Puede generar javascripts y luego ejecutarlos. Es mucho más fácil que crear usted mismo un intérprete de guiones muy limitado.

respondido 08 nov., 11:19

¡No tenía idea de que un intérprete de JavaScript estaba integrado con 1.6 lo comprobaré! - itsreeyan

Respuesta aceptada para el uso sugerido de ScriptEngineManager. Gracias, realmente has simplificado el problema. - itsreeyan

Estoy con AlexR en este.

Mientras que lo que estás haciendo es definitivamente posible, sería mejor almacenar un script ejecutable en la base de datos y ejecutar ese script en el contexto de su aplicación.

Dicho esto, cuestiono la necesidad de que el sistema sea así de flexible: solo hay una cierta cantidad de funciones (comandos) que es probable que su sistema necesite. Parece que esos comandos podrían implementarse normalmente y asignarse a claves específicas / etc. a través de un mecanismo de configuración normal.

respondido 08 nov., 11:19

No estoy seguro de lo que quiere decir con 'implementado normalmente', y aunque hay un conjunto limitado de funciones que puedo prever usar, la mayoría de las funciones tienen potencial para diferentes cantidades de parámetros (según mi ejemplo original), por lo que comienza a ser increíblemente Es complicado tratar de atender a todos estos sin algún tipo de analizador / intérprete. - itsreeyan

@Le_Ryan Tu ejemplo no me lleva a pensar que necesito un DSL para definir las claves. Cada el pago tiene un método de pago, estás diciendo que el método X está asignado a una clave. Cada el pago tiene una cantidad, está asignando $ 50 a una clave. Hasta ahora, nada requiere nada más que una configuración sencilla. - Dave Newton

Veo de dónde vienes ahora. Tenga en cuenta ese consejo para futuras referencias. ¡Gracias por tu contribución! - itsreeyan

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.