J'ai entendu dire que modificateurs d'accès em> Maintenant, je me demande combien il est correct? Et si c'est correct, cela signifie-t-il que encapsulation em> n'existe pas dans le code binaire au moment de l'exécution? Donc, si vous modifiez le binaire pour accéder à une méthode code> code> > illégalement, en théorie, il n'y a rien à vérifier vos droits, ni aucun mécanisme d'oopisme ni système d'exploitation, non? P>
J'ai aussi étiqueté la question pour C ++ et Java. Je suis au courant de la différence entre eux, juste curieux de voir à quel point ils manipulent modificateurs d'accès em>. P> public, privé et protégé protégé> ne sont que des trucs de compilateur et ils n'existent pas dans le code binaire compilé em>. p>
3 Réponses :
Veuillez noter que cette réponse concerne Java et au moment de l'exécution, JVM vérifie l'accès: p>
Vous recevrez une exception suivante si vous essayez d'accéder au temps d'exécution. Avec un niveau d'accès incorrect Java.lang.illegalAccessError: P>
espère qu'il aide p>
strong>
Les deux. Si vous essayez de compiler le code qui essaie d'accéder à un objet ou à une méthode inaccessible, vous obtiendrez une erreur de compilation: p>
Merci, c'est pourquoi j'ai marqué les deux C ++ code> et java code>. Alors, JVM code> fera la magie là-bas? Je pense comment C ++ code> va gérer cela! :)
Les modificateurs d'accès sont uniquement un mécanisme d'heure compilé en C ++. En Java Cependant, ils sont également appliqués au moment de l'exécution, car Java dispose également d'un système d'exécution, et il peut créer de manière dynamique (à l'exécution) créer des classes. Il a donc besoin de faire respecter l'accès au moment de l'exécution pour les types qu'il ne sait pas à l'heure de la compilation.
Le seul but des modificateurs d'accès est de faire respecter la conception. P >
Dites que vous avez une classe et certains code à l'aide de la classe Le code ci-dessus peut appeler Maintenant, pourquoi voudriez-vous que certains membres accessibles au code extérieur et d'autres non?
Eh bien, voici la raison pour laquelle: pour le moment, la méthode MAINTENANT, s'il y avait du code en dehors de votre classe en utilisant Ceci vous permet de reflicader le code dans L'avenir sans se soucier que d'autres Code utilisent des membres internes. P> en Java Cependant, les classes peuvent être créées au moment de l'exécution si je ne me trompe pas. Quelle est la raison pour laquelle il doit également vérifier l'accès au moment de l'exécution aussi afin qu'il puisse les appliquer, donc A code> que vous avez implémenté p> A code>: < / p> a_obj.dosomething () code>, mais ils n'ont pas accès direct à MPRivMember, donc A.MPRivRMember Code> écrit de la classe extérieure A code> ne compilera pas. P> dossommé () code> utilise mprivmember code> pour réellement faire des choses. Mais après un certain temps, vous pouvez décider que vous voulez refacteur em> le code dans DOSMUSIAT, pour l'améliorer. Vous avez trouvé une façon différente de faire quelque chose em> qui n'implique pas d'utiliser mprivmember code> plus. Donc, vous supprimez mprivmember code> et réimplément DOSOMODIAT code> une autre manière. P> MPRivMember code> , ce code ne compilerait plus parce que vous avez supprimé mprivmember code> lors de la réimplanisation DOSMATHIGH code>. Pour prévenir l'existence de ce code, vous limitez l'accès au MPRivMember code>. Le mécanisme à faire est à travers les qualificatifs d'accès em> tels que privé code> et protégé code>. P> RECAP H2>
public code> privé code> et protégé code> sont compilés des mécanismes d'heure en C ++. Ils n'existent pas dans la forme binaire générée de votre programme, et donc de telles protections ne sont pas appliquées. Tout est accessible de n'importe où. P> privé code> public code> et protégé code> existe un binaire Java. P> p>
Pensez-vous que cela pourrait être utile si nous les avons en binaire aussi? Pourrait-il être utile dans tous les cas?
Non, puisque les binaires ne sont pas censés être modifiés sous cette forme. Et un binaire ne sera pas généré si les droits d'accès sont violés dans un code source en premier lieu, en raison de la compilation des erreurs de temps, la mise en place de tels mécanismes d'application dans un binaire s'en brûler inutilement et ajouterait des frais généraux et être redondant.
@MAHDI Notez que dans Java, les modificateurs d'accès existent sur la forme binaire. J'ai mis à jour la section de récapitulatif de ma réponse pour expliquer pourquoi.
Code C ++ compilé n'a aucun concept de privé / protégé / public. Il tombe au code de la machine, qui n'a pas de concept de celles-ci. Sans support natif pour cela, comment pourriez-vous les soutenir? Mieux encore, comment pouvez-vous même faire un soutien natif pour cela. P>
Les modificateurs d'accès sont destinés aux humains, pas pour les machines. Les modificateurs d'accès sont un aspect conception em>, et non un aspect de sécurité. P>
tl; dr fort>: au moment où le code C ++ est en train d'exécuter la machine n'a aucune idée privée / publique / protégée existait jamais. P>
Je pensais qu'il pourrait y avoir un mécanisme comme une table d'accès code> incluse dans le binaire, vérifiant les droits ...
@Mahdi Nope :). Cela ajouterait une énorme performance frappée pour ajouter quelque chose comme ça à ce faible niveau de niveau. Vous devez essentiellement faire une recherche supplémentaire pour tout i> code. Cela signifierait une énorme diminution de la performance. (En outre, il faudrait littéralement être fait à un niveau matériel. Sinon, comment arrêtez-vous le code de simplement sauter à une adresse «privée»? En fait, maintenant que je pense à cela ... Je n'ai aucune idée du tout comment vous pourrait mettre en œuvre de vrai privé / public / protégé sans différents espaces d'adresses ni tables de recherche fou.)
Oh oui! Je vois ce que tu veux dire! Nous avons besoin de processeurs OOP CODE> ...: D