Comment invoquer une méthode avec une super-classe
-
06-07-2019 - |
Question
J'essaie d'invoquer une méthode qui prend une super classe en tant que paramètre avec des sous-classes dans l'instance.
public String methodtobeinvoked(Collection<String> collection);
Maintenant, si invoquer via
List<String> list = new ArrayList();
String methodName = "methodtobeinvoked";
...
method = someObject.getMethod(methodName,new Object[]{list});
Il échouera sans une telle méthode Exception
SomeObject.methodtobeinvoked(java.util.ArrayList);
Même si une méthode pouvant prendre le paramètre existe.
Avez-vous des idées sur la meilleure façon de contourner cela?
La solution
Vous devez spécifier le paramètre types dans getMethod ()
invocation:
method = someObject.getMethod("methodtobeinvoked", Collection.class);
Le tableau d'objets n'est pas nécessaire. java 1.5 supporte varargs.
Mettre à jour (en fonction des commentaires)
Vous devez donc faire quelque chose comme:
Method[] methods = myObject.getClass().getMethods();
for (Method method : methods) {
if (!method.getName().equals("methodtobeinvoked")) continue;
Class[] methodParameters = method.getParameterTypes();
if (methodParameters.length!=1) continue; // ignore methods with wrong number of arguments
if (methodParameters[0].isAssignableFrom(myArgument.class)) {
method.invoke(myObject, myArgument);
}
}
Ce qui précède ne vérifie que les méthodes publiques avec un seul argument. mettre à jour au besoin.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow