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?
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
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.
}
}
Avec le printemps:
Method method = ReflectionUtils.findMethod(TheClass, "methodName");
if (method != null) {
//do what you want
}
Si vous utilisez Spring Framework, la manière la plus simple serait d'utiliser l'utilitaire ReflectionUtils.findMethod()
.
Vous pouvez utiliser Reflection dans Java http://docs.Oracle.com/javase/tutorial/reflect/index.html
ou http://docs.Oracle.com/javase/tutorial/reflect/member/methodType.html