7
votes

En utilisant la réflexion pour obtenir une méthode; Les paramètres de la méthode des types d'interface n'ont pas trouvé

Comment puis-je obtenir une méthode à l'aide de la réflexion basée sur une valeur de paramètre lorsque le type de paramètre est une interface?

Dans le cas suivant (basé sur Cet exemple ), NewValue serait une liste appelé < Code> FOO . Donc, j'appellerais addmodelproperty ("bar", foo); mais cela ne fonctionne que si je n'utilise pas l'interface et utilisez uniquement linkedlist foo . Comment utiliser une interface pour newvalue et obtenir la méthode à partir de Modèle qui a une interface comme paramètre Addbar (liste a0) ? xxx xxx


1 commentaires

Pourquoi ne postez-vous pas le code que vous avez essayé et qui ne fonctionne pas, nous pouvons voir comment vous aimeriez qu'il fonctionnerait?


3 Réponses :


14
votes

Vous devrez réellement rechercher toutes les méthodes de votre modèle et trouver ceux qui sont compatibles avec les arguments que vous avez. C'est un peu salissant, car, en général, il pourrait y avoir plus que l'un.

Si vous êtes intéressé par des méthodes publiques, la méthode getMethods () code> est la méthode la plus facile à utiliser, car elle Vous donne toutes les méthodes accessibles sans marcher dans la hiérarchie de la classe. P>

Collection<Method> candidates = new ArrayList<Method>();
String target = "add" + propertyName;
for (Method m : model.getClass().getMethods()) {
  if (target.equals(m.getName())) {
    Class<?>[] params = m.getParameterTypes();
    if (params.length == 1) {
      if (params[0].isInstance(newValue))
        candidates.add(m);
    }
  }
}
/* Now see how many matches you have... if there's exactly one, use it. */


2 commentaires

Nous ne pouvons pas utiliser cela pour une méthode privée


@Hendrawd c'est vrai. Pour une méthode privée, vous devez utiliser getdeclaredmethods () pour répertorier les méthodes, et si la méthode n'est pas trouvée, vous devez répéter le processus sur la classe mère, etc.



8
votes

Si cela ne vous dérange pas d'ajouter une dépendance à Apache Commons, vous pouvez utiliser méthodétitils.getmatchingAccessiblemethod (Classe Clazz, String MethodName, Classe [] ParameTypes) .

Si vous voulez ajouter cette dépendance, vous pouvez au moins le trouver utile de jeter un coup d'œil à Comment cette méthode est mise en œuvre .


0 commentaires

0
votes

Une autre réponse suggérée à l'aide de Apache Commons pour obtenir la méthode Méthode code> à l'aide de Médipleuils .getmatchingaccessiblememethod code>.

Cependant, il semble que vous n'utilisez pas l'objet code> méthode code> pour autre chose que d'invoquer immédiatement une instance. Cela étant le cas, vous pouvez plutôt utiliser Apache Commons Lang's méthodeutils.invokemeThod (objet objet, chaîne MethodName, objet ... argense) . Plutôt que de simplement retourner la méthode code> code>, cela invoque plutôt la méthode sur l'objet donné. P>

protected void addModelProperty(String propertyName, Object newValue) {
  try {
    MethodUtils.invokeMethod(model, "add" + propertyName, newValue);
  } catch (ReflectiveOperationException e) {
  }
}


0 commentaires