6
votes

Méthode d'accès à la réflexion Java avec modificateur par défaut dans la super classe

est-il possible d'invoquer la méthode sans modificateur dans une superclasse à travers la réflexion Java?


1 commentaires

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.


3 Réponses :


1
votes

Oui. Vous devrez peut-être appeler SETPESSIBLE (True) sur l'objet méthode avant de l'invoquer.


2 commentaires

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.



8
votes
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);

2 commentaires

Ne serait-il pas préférable de récupérer méthode [] à l'aide de getdeclaredmethods () 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.



4
votes

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:

Je ne pense pas que l'appeler une méthode remplacée est possible, par

http://blogs.oracle.com/sundararajan/enterry/calling_overriden_superclass_mesthod_on

Notablement:

méthode.invoke

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.


0 commentaires