Comment avez-vous accès protégé méthode Java tiers de la bibliothèque?
Supposons que vous devez accéder à une méthode protégée d'un objet Java que vous recevez quelque part dans votre code. Quelle est votre solution?
Je connais une approche: Vous pouvez employer la réflexion et l'appel setAccessible(true) sur la Méthode de l'objet.
Toute autre idée?
Travaillez-vous avec une bibliothèque qui a publié un API? Si oui, ajouter cette info à la question; vous apprendrez à mieux vous aider.
Ce n'est pas la première fois que je rencontre ce problème, mais si vous êtes curieux: Debug d'Eclipse Plugin, JDILocalVariable, getStackFrame. Url: docjar.com/docs/api/org/eclipse/jdt/internal/debug/core/model/...
Ce n'est pas la première fois que je rencontre ce problème, mais si vous êtes curieux: Debug d'Eclipse Plugin, JDILocalVariable, getStackFrame. Url: docjar.com/docs/api/org/eclipse/jdt/internal/debug/core/model/...
OriginalL'auteur salman.mirghasemi | 2011-06-20
Vous devez vous connecter pour publier un commentaire.
Que par la java modificateurs d'accès, en plus de l'extension de l'objet (qui vous ne pouvez pas si vous recevez de l'objet) est d'accéder à partir d'un objet dans le même package que l'objet que vous avez reçu. Si votre option est de créer une classe wrapper dans le même paquet qui récupère l'attribut via la méthode protégée pour vous.
OriginalL'auteur rsp
Vous pouvez sous-classe de la méthode, de créer une méthode publique qui appelle la méthode protégée et retourne le résultat.
Si vous ne pouvez pas le faire (si la classe est finale), puis setAccessible est assez bien votre seul moyen.
Je suppose que vous voulez dire le convertir en un autre type. Non, vous ne pouvez pas convertir le type d'objet (classe) d'un autre type d'objet lors de l'exécution. Vous pouvez l'envelopper dans un autre objet, mais le problème avec accès protégé et reste encore. Aussi, si votre objet est généré à l'aide de spring ou hibernate ou de tout autre cadre qui rend l'usage de l'exécution de serveur proxy, il n'est pas garanti que la réflexion marchera. La cible proxy ne contiendra pas toutes les méthodes qui ne sont pas publiques dans la classe proxy.
OriginalL'auteur pap
Une autre option consiste à créer une classe qui étend la classe que la 3ème partie de la classe qui a la méthode protégée que vous êtes intéressé à.
et
avez-vous accès à la troisième partie de la classe au moment de la compilation?
Il est déjà respecté.
OriginalL'auteur Bala R
Vous pouvez également étendre la classe, remplacer la méthode, et de faire la méthode de remplacement-être public. Alors il suffit d'appeler super.méthode().
C'est correct. Dans ce cas, la réflexion est votre seule option.
OriginalL'auteur Reverend Gonzo
L'autre façon est d'étendre la Classe (si possible) et d'obtenir l'accès à la méthode protégée par héritage. Si vous ne créez pas l'Objet ce n'est pas possible, car vous en aurez besoin au moment de la compilation et vous avez besoin pour créer l'Objet vous-même.
Un peu louches solution pourrait être d'utiliser la composition. Ainsi, vous créez une classe du même package par exemple OtherObjectWrapper. C'est dans le même package que vous pourriez appeler l'Objet de la méthode protégée par une API publique vous exposer. Ce n'est pas conseillé si, comme vous ne possédez pas le paquet qui vous sont ajout d'une Classe aussi, et vous pouvez rendre votre code très fragile par exemple
Penser à ce que l'API concepteur de la pensée quand ils ont marqué la méthode protégées? Peut-être qu'ils n'ont pas la moindre idée de ce qu'ils faisaient, et il doit être publique, ou, pire encore, il convient de colis privé ou privé d'emblée. Ou peut-être qu'ils ont fait et ils ont déterminé uniquement code dans le même colis ou par héritage devraient avoir accès à la méthode protégée. Si elle est protégée, il pourrait bien être pour une raison, donc méfiez-vous que vous pouvez attacher vos codes de comportement à des comportements qui peuvent changer et briser votre code. Aussi, chercher à savoir qui est propriétaire de la troisième partie de l'Objet et s'il existe une meilleure API d'accès à la méthode protégée de la fonctionnalité.
OriginalL'auteur planetjones
Si vous pouvez mettre l'appel de la classe du même package, vous aurez accès à la méthode.
Ce et héritant de cette classe sont les seuls non-réfléchissant manières d'accéder à une méthode protégée.
OriginalL'auteur Sergio
Comme déjà dit, le sous-classement est normalement le moyen standard pour accéder à cette méthode.
D'autres approches (wrapper dans le même package, réflexion) on ne devrait généralement pas utilisés, car si vous ne pouvez pas étendre la classe (en raison de la finale), il y a souvent de bonnes raisons accéder à cette méthode est difficile.
Si la bibliothèque est de bonne qualité, vous ne devriez pas avoir à utiliser les autres moyens outre-classement pour accéder à une méthode protégée ou non l'accès à cette méthode.
OriginalL'auteur Thomas