web-dev-qa-db-fra.com

Comment vérifier si une classe Java Java contient une méthode particulière?

J'ai un schéma xml (généré automatiquement à l'aide de trang) qui ne cesse de changer. Ces changements ne sont pas très élaborés. Seuls certains éléments sont ajoutés ou supprimés de ce schéma. À partir de ce schéma, je génère des classes Java (à l'aide de cxf) par lesquelles je désarchiverai le document xml.

Au fur et à mesure que le schéma change, mes classes Java générées automatiquement changent également. De nouveau, comme avec le schéma, les modifications dans Java ne sont pas très importantes. Par exemple, si un élément dit elemA est ajouté au schéma; certaines fonctions connexes disent getElemA() et setElemA() sont ajoutées à la génération automatique Java class .

Maintenant, comment puis-je m'assurer qu'une fonction particulière existe dans ces classes générées automatiquement? Une solution consiste à écrire à la main le schéma de sorte que tous les éléments possibles de xml soient couverts. C'est ce que je ferai finalement. Mais pour l'instant, je n'ai pas fixé le format du fichier xml.

MISE À JOUR :

Il existe une possibilité qu'une méthode getElemA() puisse être définie dans des classes générées automatiquement. Je n'ai aucun contrôle sur la génération automatique de ces classes. Mais dans ma classe principale, si j'ai le code suivant,

If method getElemA exists then 
     ElemA elemA = getElemA()

Ce code sera toujours là dans ma classe principale. Si la méthode getElemA() est générée dans l'une des classes générées automatiquement, il n'y a pas de problème. Mais si cette méthode n'est pas générée, les compilateurs se plaignent que cette méthode n'existe dans aucune des classes.

Existe-t-il un moyen pour que le compilateur ne se plaigne pas de cette fonction au moment de la compilation?

24
Dilawar

Une méthode est mentionnée par @missingfaktor et une autre est ci-dessous (si vous connaissez le nom et les paramètres de l'API).

Disons que vous avez une méthode qui ne prend aucun argument:

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

Appelez-le s'il est présent:

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

Supposons que vous ayez une méthode qui utilise les arguments natifs int:

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

Appelez-le s'il est présent:

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

Supposons que vous ayez une méthode qui utilise les arguments Integer:

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

Appelez-le s'il est présent:

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

L'utilisation du soln ci-dessus pour appeler la méthode ne vous donnera pas d'erreurs de compilation. Mis à jour selon @Foumpie

40
havexz

Utilisez réflexion .

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

Modifier:

Vous souhaitez donc invoquer la méthode si elle existe. Voici comment procéder:

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.
  }
}
20
missingfaktor

Avec le printemps:

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

Si vous utilisez Spring Framework, la manière la plus simple serait d'utiliser l'utilitaire ReflectionUtils.findMethod().

4
snowindy
1