2012-06-04 9 views
16

Ho uno schema xml (generato automaticamente usando trang) che continua a cambiare. Questi cambiamenti non sono molto elaborati. Solo alcuni elementi vengono aggiunti o eliminati da questo schema. Da questo schema, sto generando classi java (usando cxf) con cui eliminerò il documento XML.Come verificare se una classe java ha un metodo particolare in esso?

Come lo schema cambia, anche le mie classi java generate automaticamente cambiano. Di nuovo, come con lo schema, i cambiamenti nelle classi java non sono molto grandi. Ad esempio, se un elemento dice elemA viene aggiunto allo schema; alcune funzioni correlate dicono getElemA() e setElemA() vengono aggiunte alla classe java generata automaticamente.

Ora, come faccio ad accertarmi che esista una funzione particolare in queste classi generate automaticamente? Una soluzione è scrivere a mano lo schema in modo tale da coprire tutti i possibili elementi di xml. Questo è ciò che alla fine farò. Ma per ora, non ho risolto il formato del file xml.

UPDATE:

C'è la possibilità che un metodo getElemA() può essere definito nelle classi auto-generate. Non ho il controllo sulla generazione automatica di queste classi. Ma nella mia classe principale, se ho codice seguente,

If method getElemA exists then 
    ElemA elemA = getElemA() 

Questo codice sarà sempre presente nella mia classe principale. Se il metodo getElemA() viene generato in una delle classi generate automaticamente, non ci sono problemi. Ma se questo metodo non viene generato, i compilatori si lamentano che questo metodo non esiste in nessuna classe.

Esiste un modo per consentire al compilatore di non lamentarsi di questa funzione in fase di compilazione?

risposta

32

Un metodo è menzionato da @missingfaktor e un altro è inferiore (se si conosce il nome e parametri della api).

Diciamo che avete un metodo che non prende argomenti:

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

invocarlo se 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); 
} 

Diciamo che avete un metodo che prende nativi int args:

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

Richiamalo se 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))); 
} 

Diciamo che avete un metodo che prende in scatola Integer args:

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

invocarlo se 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))); 
} 

Utilizzando le soln sopra per richiamare il metodo non vi darà la compilazione errori . Aggiornato come da @Foumpie

+0

Grazie. Voglio usare il metodo e devo scrivere tutti i metodi possibili in quella classe, ma la classe generata automaticamente potrebbe non avere quel metodo. Come far sì che il compilatore ignori questo in fase di compilazione? – Dilawar

+0

L'uso di invoke non ti dà errori di compilazione ... controlla gli ans aggiornati. – havexz

+0

Grazie mille. Dopo averlo racchiuso in "try-catch", ha funzionato come un incantesimo. – Dilawar

17

Usa 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; 
    } 
} 

Edit:

Così si vuole richiamare il metodo, se esiste. Ecco come si fa:

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

Grazie per il codice. Il problema principale è anche se ho identificato che esiste un metodo 'getA', esiste una nota, ho bisogno di scrivere quella funzione. Ad esempio, se esiste il metodo A, quindi methodA() '. Sta dando errore di compilazione in quanto questo metodo non esce. Come posso lasciare andare la compilation e renderla un controllo run-time? – Dilawar

+0

@Dilawar, la tua domanda non è chiara. Per favore riformulare – missingfaktor

+1

@Dilawar, dovresti esaminare alcuni tutorial di riflessione, perché sembra che ne avrai molto bisogno. – missingfaktor

4

Se si utilizza Spring Framework, il modo più semplice sarebbe utilizzare l'utilità ReflectionUtils.findMethod().

8

Con Primavera:

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