est-il possible d'invoquer la méthode sans modificateur dans une superclasse à travers la réflexion Java? P>
3 Réponses :
Oui. Vous devrez peut-être appeler SETPESSIBLE (True) sur l'objet méthode avant de l'invoquer. p>
GetMethod et GetDeclaredmethod échecent à la fois si l'on appelle la sous-classe. et la fixation n'est pas nécessaire.
De ce commentaire Je suppose que vous essayez d'appeler une méthode avec des paramètres. Vous devez les spécifier lors de la recherche de la méthode.
Class current = getClass(); Method method = null; while (current != Object.class) { try { method = current.getDeclaredMethod("doSomething"); break; } catch (NoSuchMethodException ex) { current = current.getSuperclass(); } } // only needed if the two classes are in different packages method.setAccessible(true); method.invoke(this);
Ne serait-il pas préférable de récupérer méthode [] code> à l'aide de
getdeclaredmethods () code> et vérifier pour voir si nous avons un nom de méthode qui correspond plutôt que de saisir l'exception? Ce dernier n'est-il pas assez lent car une trace de pile doit être générée à chaque fois? Ou suis-je optimisant prématurément? :)
Les structures sont générées paresseusement; Si vous ne le demandez pas, il n'est pas généré. Vous pouvez tester cela en définissant un point d'arrêt dans la méthode GetoursstackTrace de lanceur, puis de lancer et d'exception.
Après avoir lu la question originale - je me rendais compte que je supposais que vous essayiez d'appeler une méthode remplacée. C'est ce que j'essayais de faire et comment je suis venu trouver ce fil. Appeler une méthode de classe de base non dominée doit fonctionner comme d'autres ici ont décrit. Cependant, si vous essayez d'appeler une méthode remplacée, ma réponse se tient ci-dessous: P>
Je ne pense pas que l'appeler une méthode remplacée est possible, par p>
http://blogs.oracle.com/sundararajan/enterry/calling_overriden_superclass_mesthod_on p>
Notablement: P>
méthode.invoke p>
Si la méthode sous-jacente est une méthode d'instance, elle est appelée à l'aide de la recherche de méthode dynamique comme documentée dans la spécification de langue Java, deuxième édition, section 15.12.4.4; En particulier, il se produira notamment sur le type d'exécution de l'objet cible. p>
Notez qu'il est important de spécifier si la méthode que vous essayez d'appeler a été remplacée dans la sous-classe. Pouvez-vous appeler une méthode protégée par un paquet (accès par défaut) via une réflexion? Oui. Pouvez-vous invoquer une méthode remplacée via une réflexion? Non, la méthode de dépassement sera invoquée. Les réponses ci-dessous font des hypothèses différentes sur cette question.