2010-06-16 14 views
21

que tiene una matriz de cadenas que contiene los nombres de método en la clase yyyyyyJava función dinámica llamando

En la clase xxxxxx estoy haciendo una yyyyyy instancia (por ejemplo obj). Ahora puedo llamar al obj.function_name(), excepto que quiero leer function_name de la matriz de cadenas en un bucle. es posible?

+1

puedes contar? No es tan claro de entender. –

+3

Creo que el término que está buscando es "reflexión". – Stephen

+0

y también estoy seguro de lo que quiso decir es este: http://stackoverflow.com/questions/160970/how-do-i-invoke-a-java-method-when-given-the-method-name -as-a-string – gumuruh

Respuesta

32

Usted puede, usando reflection. Se realiza llamando al Yyyy.class.getMethod("methodName").invoke(someArgs)

Tendría que manejar un grupo de excepciones, y su método debe ser public. Tenga en cuenta que las convenciones de codificación java prefieren methodName a method_name.

El uso de la reflexión, sin embargo, debe ser un último recurso. Deberías estar usando más técnicas orientadas a objetos.

Si necesita constantemente características similares, tal vez se puede ver en un lenguaje dinámico que se ejecuta en la plataforma Java, como groovy

22

Es posible usar la reflexión, aunque probablemente debería cuestionar un poco su diseño si necesita ese tipo de comportamiento. Class.getMethod toma un String para el nombre del método y devuelve un objeto Method, que luego se puede llamar .invoke de llamar al método

Estas páginas Javadoc debería ser útil:

Código de muestra (suponiendo que los métodos yyyyyy toman un argumento int, solo para mostrar el argumento pa ssing):

yyyyyy obj = new yyyyyy(); 
String[] methodNames = {"foo", "bar", "baz"}; 
for(String methodName : methodNames) { 
    Method method = Class.forName("yyyyyy").getMethod(methodName, new Class[] {int.class}); 
    method.invoke(obj, 4); // 4 is the argument to pass to the method 
} 
+1

¿Por qué no usas 'obj.getClass()' en lugar de 'Class.forName ("yyyyyy") '? – Marc

+0

enlaces están en mal estado, intente reemplazar (con% 28 y) con% 29 –

+1

@Marc Yo realmente prefiero 'yyyyyy.class' a cualquiera de los dos, pero cualquier trabajo –