2012-06-04 18 views
16

Tengo un esquema xml (generado automáticamente mediante trang) que sigue cambiando. Estos cambios no son muy elaborados. Solo algunos elementos se agregan o eliminan de este esquema. A partir de este esquema, estoy generando clases Java (usando cxf) mediante las cuales deshago el documento xml.¿Cómo comprobar si una clase Java tiene un método particular en ella?

Como los cambios de esquema, mis clases Java generadas automáticamente también cambian. De nuevo, como con el esquema, los cambios en las clases de Java no son muy grandes. Por ejemplo, si un elemento dice elemA se agrega al esquema; algunas funciones relacionadas dicen que getElemA() y setElemA() se agregan a la clase java autogenerada.

Ahora, ¿cómo habría que asegurarse de que existe una función particular en estas clases generadas automáticamente? Una solución es escribir a mano el esquema de modo que se cubran todos los elementos posibles de xml. Esto es lo que finalmente haré. Pero por ahora, no he corregido el formato del archivo xml.

UPDATE:

Hay una posibilidad de que un método getElemA() puede definirse en las clases de auto-generado. No tengo control sobre la generación automática de estas clases. Pero en mi clase principal, si tiene el código siguiente,

If method getElemA exists then 
    ElemA elemA = getElemA() 

Este código siempre estará allí en mi clase principal. Si se genera el método getElemA() en una de las clases generadas automáticamente, entonces no hay problema. Pero si este método no se genera, los compiladores se quejan de que este método no existe en ninguna clase.

¿Hay alguna manera de que puedo hacer compilador que no se quejan de esta función en tiempo de compilación?

Respuesta

32

Uno de los métodos es mencionado por @missingfaktor y otro está por debajo (si se conoce el nombre y los parámetros de la API).

Digamos que tienes un método que no toma argumentos:

Method methodToFind = null; 
try { 
    methodToFind = YouClassName.class.getMethod("myMethodToFind", (Class<?>[]) null); 
} catch (NoSuchMethodException | SecurityException e) { 
    // Your exception handling goes here 
} 

invocarlo si está presente:

if(methodToFind == null) { 
    // Method not found. 
} else { 
    // Method found. You can invoke the method like 
    methodToFind.invoke(<object_on_which_to_call_the_method>, (Object[]) null); 
} 

Digamos que tienes un método que toma nativos int args:

Method methodToFind = null; 
methodToFind = YouClassName.class.getMethod("myMethodToFind", new Class[] { int.class }); 

Invocar si está presente:

if(methodToFind == null) { 
    // Method not found. 
} else { 
    // Method found. You can invoke the method like 
    methodToFind.invoke(<object_on_which_to_call_the_method>, invoke(this, 
     Integer.valueOf(10))); 
} 

Digamos que tienes un método que tiene en caja Integer args:

Method methodToFind = null; 
methodToFind = YouClassName.class.getMethod("myMethodToFind", new Class[] { Integer.class }); 

invocarlo si está presente:

if(methodToFind == null) { 
    // Method not found. 
} else { 
    // Method found. You can invoke the method like 
    methodToFind.invoke(<object_on_which_to_call_the_method>, invoke(this, 
     Integer.valueOf(10))); 
} 

Usando Soln arriba para invocar el método no le dará la compilación errores . Actualizado según @Foumpie

+0

Gracias. Quiero usar el método y tengo que escribir todos los métodos posibles en esa clase, pero la clase autogenerada puede no tener ese método. ¿Cómo hacer que el compilador ignore esto en tiempo de compilación? – Dilawar

+0

El uso de invocación no le dará errores de compilación ... revise las respuestas ans. – havexz

+0

Muchas gracias. Después de encerrarlo en 'try-catch', funcionó como un amuleto. – Dilawar

17

Uso reflection.

import java.lang.reflect.Method; 

boolean hasMethod = false; 
Method[] methods = foo.getClass().getMethods(); 
for (Method m : methods) { 
    if (m.getName().equals(someString)) { 
    hasMethod = true; 
    break; 
    } 
} 

Editar:

Así que quieres invocar el método si existe. Así es como se hace:

if (m.getName().equals(someString)) { 
    try { 
    Object result = m.invoke(instance, argumentsArray); 
    // Do whatever you want with the result. 
    } catch (Exception ex) { // For simplicity's sake, I am using Exception. 
          // You should be handling all the possible exceptions 
          // separately. 
    // Handle exception. 
    } 
} 
+0

Gracias por el código. El problema principal es que incluso si identifico que existe un método 'getA' does note, necesito escribir esa función. Por ejemplo 'si el método A existe entonces el método A()'. Da error de compilación ya que este método no se cierra. ¿Cómo puedo dejar que la compilación continúe y convertirla en un control en tiempo de ejecución? – Dilawar

+0

@Dilawar, su pregunta no está clara. Por favor reformula. – missingfaktor

+1

@Dilawar, deberías leer algunos tutoriales de reflexión, porque parece que vas a necesitarlo mucho. – missingfaktor

4

Si utiliza Spring Framework, la forma más sencilla sería utilizar la utilidad ReflectionUtils.findMethod().

8

Con la primavera:

Method method = ReflectionUtils.findMethod(TheClass, "methodName"); 
if (method != null) { 
    //do what you want 
} 
Cuestiones relacionadas