2011-02-04 13 views
7

Tengo un método estático titulado chooseDialog (String s, int i) en el que quiero llamar a otro método dentro de la misma clase (Dialogs.class) en función de los parámetros proporcionados para chooseDialog. s es el nombre del método deseado y yo es su único parámetro.Android/Java: ¿Llamar a un método usando la reflexión?

He intentado numerosos tutoriales y he dedicado algunas horas a leer sobre el tema, pero parece que no puedo entender con certeza qué es exactamente lo que tengo que hacer.

¿Alguna idea?

Gracias!

+0

¿Realmente necesita reflexión? – dacwe

+1

Si bien puede haber una buena solución a su problema, puede ser mejor publicar el problema real que está tratando de resolver. P.ej. ¿Por qué quieres hacer este tipo de selección de método? Con bastante frecuencia, alguien puede encontrar un patrón de diseño OOP que resuelva el problema subyacente en lugar de encontrar una solución par-force para la pregunta específica. Por ejemplo, el patrón de fábrica puede ser lo que necesita, permitiéndole seleccionar clases, que luego proporcionan la función requerida como implementaciones de un mensaje abstracto. No permita que los detalles de su problema le permitan perder de vista la imagen más grande. – Ber

+0

Cada método en esta clase (que no sea chooseDialog) representa una serie de acciones únicas (más de 10 cada una) y esta clase en particular consiste en más de 300 métodos para elegir. Esta parecía ser la mejor ruta para mí. ¿Soy incorrecto? ¿Hay alguna opción mejor? – Jared

Respuesta

13

¿Por qué quiere llamar a un método con el nombre pasado en un parámetro de cadena? ¿No puedes crear constantes para diferentes acciones, luego usar switch y en cada caso llamar al método con el parámetro i?

Tendrás la ventaja de que el compilador revise tu código para ver si hay errores.

edición: si realmente desea utilizar la reflexión, recuperar un objeto con Method:

Method m = YourClass.class.getMethod("method_name",new Class[] { Integer.class }) 

supongo Integer.class podría funcionar. A continuación, invocar el métodos como

m.invoke(null,123); //first argument is the object to invoke on, ignored if static method 
+0

Cada método en esta clase (que no sea chooseDialog) representa una serie de acciones únicas (más de 10 cada una) y esta clase en particular consta de más de 300 métodos para elegir. Esta parecía ser la mejor ruta para mí. ¿Soy incorrecto? ¿Hay alguna opción mejor? – Jared

+1

Si está tratando con esta gran cantidad de métodos, es probable que sea lo mejor. Pero yo mismo tendría miedo de los errores tipográficos. – Axarydax

+0

No necesita envolver los parámetros de clase en una matriz; simplemente puede proporcionarlos como una lista de argumentos. Por ejemplo: 'YourClass.class.getMethod (" method_name ", Integer.class, String.class)'. –

2
Method method = Dialogs.getMethod(s, Integer.class); 
method.invoke(null, i); 
1

Si lo que desea es llamar a otro método estático de la clase, a continuación, se puede utilizar el enfoque ya identificados por otros:

Method method = Dialogs.getMethod(s, Integer.class); 
method.invoke(null, i); 

Pero si quieres para poder usar un método estático para llamar a un método no estático, entonces deberá pasar el objeto al que desea hacer referencia o hacer que chooseDialog no sea estático.

function chooseDialog(Object o, String s, Integer i) { 
    Method method = Dialogs.getMethod(o, Integer.class); 
    method.invoke(o, i); 
} 

Pero no creo que esta sea la manera correcta de OOP para manejar el problema. Y en base a sus comentarios, la reflexión no es absolutamente necesaria, y elegir ChooseDialog analizar la cadena y pasarla al método apropiado es un enfoque mucho más seguro. En cualquiera de los enfoques, las pruebas de su unidad deben tener el mismo aspecto.

if (s.equals("dialog1")) { 
     dialog1(i); 
    } 
Cuestiones relacionadas