aidez-moi à faire cette méthode plus solide:
5 Réponses :
Que diriez-vous:
try { interfaceClass.getMethod(method.getName(), method.getParameterTypes()); return true; } catch (NoSuchMethodException e) { return false; }
Vous ne voulez pas utiliser des exceptions dans le cadre de votre logique de contrôle normale.
@Anon, en règle générale non, mais si c'est ce que l'API vous donne, alors vous y êtes. Comment déterminez-vous si une chaîne peut être analysée dans un entier?
N'a pas utilisé Java dans un certain temps - C # fournit tryparse code> à cette fin.
Nécessité d'attraper SecurityException aussi bien, bien que, dans ce cas (accès à l'emballage ou à la méthode refusée), je ne sais pas si vous voudrez retourner vrai ou faux. Si l'accès au paquet est refusé, la méthode peut ou non exister. Si l'accès à la méthode est refusé, je suis sûr que la méthode existe mais vous ne pouvez pas y accéder.
Oui, j'ai discuté pendant un moment sur Java.net pour une méthode Integer.ISint (String), mais apparemment j'étais une minorité.
@shoover, la seule façon de pouvoir obtenir les paramètres que la méthode nécessite la sécurité correspondante. Bien sûr, un gestionnaire de sécurité pourrait nier cette méthode spécifiquement, mais cela vaut la peine de défendre?
La sécurité n'est pas pertinente dans le contexte de ma question.
C'est un bon départ:
Remplacer: p> avec: p> :) p> p>
voir Méthode # GetDeclaringClass () , puis comparez simplement des objets de classe avec l'interface (s) attendue (s). P>
Je ne pense pas que vous compris la question. Je suggérerais de relire la question et toutes les réponses.
Lorsque vous appelez GetDeclaringClass () sur la méthode WhicD définie des interfaces intérieures, le résultat sera la classe d'implémentation. Donc, cela ne fonctionnera pas du tout.
Pour rendre votre méthode plus robuste, vous souhaitez probablement aussi vérifier si isterface () code>
retourne true code> pour la classe donnée et lancer
illégalargumentexception code> sinon. p>
Si vous souhaitez éviter de capturer NoschmethodException Code> de Réponse de Yashai :
for (Method ifaceMethod : iface.getMethods()) {
if (ifaceMethod.getName().equals(candidate.getName()) &&
Arrays.equals(ifaceMethod.getParameterTypes(), candidate.getParameterTypes())) {
return true;
}
}
return false;
Vous pouvez avoir deux méthodes avec le même nom mais avec différents paramètres.
Pourquoi? Quelle serait cette information acheter pour vous?
Pourquoi les gens insistent-ils toujours à savoir «le pourquoi» ici? :) Je veux exposer ces méthodes uniquement à partir d'un servlet hessien via http-get, et je souhaite filtrer des méthodes non pertinentes - le filtrage par l'interface est exactement ce dont j'ai besoin.
Parce que s'ils ne connaissent pas la réponse, la question doit être fausse.
@ RIpper234, car ils pourraient être capables de suggérer des solutions plus faciles au problème initial.
La raison pour laquelle nous nous demandons pourquoi est parce que sur la surface, il semble un peu à l'envers et votre explication laisse des détails nécessaires pour le faire. Par exemple, si vous connaissez l'interface et que vous savez que votre objet implémente cette interface, pourquoi non seulement exposent des méthodes de l'interface au lieu de la classe de béton?
Toutes les classes concrètes exposent les méthodes publiques, je ne suis pas intéressé (égaux, hachage, ...). En outre, l'objet fait partie d'une hiérarchie d'objets et ses classes de base exposent de nombreuses méthodes que je veux cacher.
Bien sûr, mais quelque chose est introspecting de cette classe pour trouver les méthodes que vous transmettez ensuite à cette fonction utilitaire pour voir s'il appartient à une interface particulière. Je me demande pourquoi vous inquiétez de manière introspective la classe de béton si vous ne voulez que des méthodes de l'interface ... Introspect Infraspect de l'interface.