Puis-je remplacer une méthode privée en Java?
Je sais que je peux utiliser la réflexion pour invoquer une méthode privée, et d'obtenir ou de définir la valeur d'une variable privée, mais je veux remplacer une méthode.
public class SuperClass {
public void printInt() {
System.out.println("I am " + getClass() + ". The int is " + getInt());
}
private int getInt() {
return 1;
}
}
public class SubClass extends SuperClass {
public static void main(String[] args) {
(new SubClass()).printInt();
}
public int getInt() {
return 2;
}
}
Je veux le main
méthode dans SubClass
à imprimer 2
mais il imprime 1
.
J'ai entendu parler de ce qui peut être fait par le biais de la réflexion, mais je ne peux pas comprendre comment.
Si pas de réflexion, personne ne sait d'une autre façon de faire?
(Autres que de faire SuperClass.getInt()
protégés, ou de copier et coller le printInt()
méthode en SubClass
.)
Si effectivement la substitution de la méthode privée n'est pas possible, est-il un moyen de placer une sorte de déclencheur qui va appeler une méthode dans mon sous-classe avant ou après la méthode privée exécute?
source d'informationauteur numbers longer
Vous devez vous connecter pour publier un commentaire.
Méthodes privées ne sont pas héréditaire et ne peut pas être remplacée en aucune façon. Celui qui vous dit que vous pouvez faire avec de la réflexion était couchée ou parler d'autre chose.
Cependant, vous pouvez accéder à la méthode privée
getInt
de ce sous-classe est en invoquantprintInt
comme suit:Cela aura l'effet de la sous-classe'
getInt
appel d'une méthode de la classe mère'printInt
.Bien sûr, maintenant, ce sera un échec si la sous-classe n'est pas déclarer un
getInt
, de sorte que vous avez à ajouter une case à être en mesure de gérer "normal" sous-classes qui n'essayez pas de "remplacer" une méthode privée:Vous avez encore de changement de la superclasse de code pour faire ce travail, et puisque vous avez à changer superclasse code, vous devez simplement modifier le modificateur d'accès sur
getInt
àprotected
au lieu de faire la réflexion hack des solutions de rechange.Vous ne pouvez pas remplacer une méthode privée parce qu'aucune autre classe, y compris une classe dérivée, peut dire qu'il existe. C'est privé.
Méthodes privées sont implicitement
final
.Sur une note, une sous-classe peut déclarer un champ ou d'une méthode avec le même nom qu'un
private
champ ou une méthode dans une classe super, car à partir de la sous-classe du point de vue, ces membres n'existent pas. Il n'y a pas de relation particulière entre ces membres.Non, vous ne pouvez pas. Vous pouvez construire un programme qui look comme il devrait être en mesure de le faire, en utilisant le fait que le code à l'intérieur d'un extérieur de la classe peuvent accéder à une classe imbriquée privée des membres. Cependant, les méthodes privées ne peut toujours pas être remplacée. Exemple:
Étant donné que ce serait la seulement situation dans laquelle il était possible de remplacer une méthode privée, c'est pas une grande perte que ce n'est pas pris en charge.
Si vous souhaitez modifier le comportement d'un membre privé de votre super-classe, votre conception est cassé, en fait.
Je ne pouvais pas le faire avec réflexion, mais j'ai trouvé un moyen de le faire via l'instrumentation. J'ai utilisé de l'ASM, comme l'a suggéré sur Dhruba Bandopadhyay blog. Si vous êtes intéressé, vous pouvez regarder mon code (il y a trop à le poster ici).
Si vous avez vraiment envie de faire cette réflexion, vous pouvez:
Je soupçonne que vous souhaitez concevoir votre programme différemment, plutôt que de prendre cette approche. Il n'est pas performant, et il va certainement attraper quelqu'un qui s'étend de la Superclasse par surprise.
Noter que la sous-classe de getInt() la méthode peut être privé, si vous utiliser la réflexion de cette façon. De nouveau, en prenant cette approche est presque certainement une Mauvaise Idée, au moins pour les deux raisons évoquées. Les Chances sont que vous pouvez atteindre vos objectifs d'une autre manière. Protection de Package est vraiment pas une option?
vous pouvez passer var par référence -> classes à l'aide de java ?
parce que si c'est toujours possible:
problème ci-dessus peut être réécrite comme:
(Remarque c'est pour la spécification but uniquement)
VB:
fonction(ByRef intX as Integer)
//valeur peut être explicitement changé, mais pas la méthode elle-même 😛
fin de fonction
beaucoup plus comme ça, je suppose...
Pas, nous ne peuvent pas remplacer les méthodes Privées, mais il y a un cas où on peut la surcharger les méthodes privées trop savoir Intérieure
}
Vous ne pouvez pas remplacer une méthode privée, mais vous pouvez introduire/redéfinir dans une classe dérivée.Comme:
En cela, vous ne sont pas substitution de ce plaisir() dans la classe Enfant vous êtes à la définition d'une nouvelle méthode avec le même nom, mais si vous essayez d'utiliser @override sur le haut de fun() de la classe Enfant que vous obtiendrez erreur de compilation parce que vous êtes forçant à ignorer ce plaisir() sinon vous êtes juste de la redéfinition de la nouvelle fun() dans la classe Enfant
Vous ne pouvez pas remplacer une méthode privée.
Une méthode de remplacement ne peut exister que dans une sous-classe de la méthode de remplacement. Si la méthode que vous souhaitez remplacer est marqué privéprimordial, il n'est pas possible en raison de la sous-classe n'hérite pas rien marqué privédonc la rupture des liens entre cette méthode et n'importe quoi dans la sous-classe, y compris de la sous-classe de méthodes.
De "surcharger" les moyens permettant à la JVM pour déterminer la méthode à utiliser en fonction du type d'instance que vous êtes en l'invoquant avec. La théorie de polymorphisme explique ce qui rend cela possible. Pour la JVM pour être en mesure de dire "ces méthodes sont connectés, l'un remplace l'autre", la JVM doit être en mesure d'afficher le substituée méthode de l'intérieur de la sous-classe qui contient le primordial méthode.
Cela étant dit, les classes dans le cas que vous avez fournis toujours compiler, mais aucune de ces méthodes seront appelées en fonction de la Jvm indépendamment de l'instance d'exécution basé sur l'invocation. Ils vont simplement être différentes méthodes au total, qui ne sont pas reconnus par la JVM comme substituée ou de la transgression.
En outre, si vous utilisez un IDE comme NetBeans, à l'aide de l' @Override annotation indiquer au compilateur que vous êtes à la substitution de la méthode avec la même signature dans la superclasse. Si vous ne le faites pas, vous obtiendrez un avertissement, ce qui suggère que vous faites de l'annotation. Vous obtiendrez une erreur de compilation, cependant, si vous appliquez cette annotation lorsque:
OU
Consultez la page officielle documentation Oracle https://docs.oracle.com/javase/tutorial/java/IandI/override.html
pour l'extrait suivant:
Substituant peut être très déroutant, car elle implique la JVM prendre des mesures apparemment de façon indépendante. Rappelez-vous juste que, sans accès à la méthode de[s] dans la super-classe (en d'autres termes, pour toutes les méthodes marqué privé), le sous-classe ne peut pas invoquer ou de remplacer ladite méthode[s], car il ne peut pas hériter.
Lire attentivement,
Méthodes PRIVÉES ne sont PAS HÉRÉDITAIRE... Comme ils ne sont pas héritées, ils NE peuvent pas ÊTRE REMPLACÉES