Kann ich überschreiben, eine private Methode in Java?
Ich weiß, dass ich verwenden können, Reflexion, rufen eine private Methode, und zum abrufen oder festlegen der Wert einer privaten Variablen, aber ich möchte eine Methode überschreiben.
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;
}
}
Möchte ich die main
Methode in SubClass
ausdrucken 2
, aber es druckt 1
.
Ich habe gehört, dass dies getan werden kann, durch Reflexion, aber ich kann nicht herausfinden, wie.
Wenn nicht Reflexion, kennt jemand einen anderen Weg, es zu tun?
(Anders als die SuperClass.getInt()
geschützt, oder kopieren und einfügen der printInt()
Methode in SubClass
.)
Wenn tatsächlich überschreiben der privaten Methode nicht möglich ist, gibt es eine Möglichkeit der Unterbringung eine Art trigger, der es wird, eine Methode aufzurufen, die in meiner sub-Klasse, die entweder vor oder nach der privaten Methode führt?
machen Sie es
protected
oder visible
...sonst kippe"Kann ich überschreiben, eine private Methode in Java?" -- Antwort: Nein
placing some sort of trigger on it that will invoke a method in my sub-class either before or after the private method executes
- Sie können CGLIB oder javassist mit AOP Techniken, um dies zu ermöglichen. Spring
verwendet sogenannte around-advice
schwer.Nicht einmal javassist kann, außer eine private Methode, aber load-time-weaving beraten können private Methoden (nicht durch überschreiben von Ihnen, obwohl).
InformationsquelleAutor numbers longer | 2012-05-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Private Methoden werden nicht vererbt und kann nicht überschrieben werden, in keiner Weise. Wer Ihnen sagte, Sie es tun können, mit Reflexion war entweder liegend oder über etwas anderes reden.
Allerdings können Sie den Zugriff auf die private Methode
getInt
welcher Unterklasse aufrufenprintInt
etwa so:Dies die Wirkung haben wird, die Unterklasse'
getInt
Methode aufgerufen wird, von der Oberklasse'printInt
.Natürlich, jetzt ist diese fehl, wenn die Unterklasse nicht erklären
getInt
, so dass Sie hinzufügen müssen, um eine überprüfung abwickeln zu können "normale" Unterklassen, die nicht versuchen, zu "überschreiben" eine private Methode:Haben Sie immer noch ändern Oberklasse-code, um diese Arbeit zu machen, und da haben Sie zu ändern Oberklasse-code sollten Sie nur ändern Sie den zugriffsmodifizierer auf
getInt
zuprotected
anstatt das zu tun, Reflexion hack-Lösungen.Ich denke, die
for
loop-Zustand sein solltefor( Method method : classWithGetInt.getDeclaredMethods() )
.InformationsquelleAutor trutheality
Können Sie nicht überschreiben Sie eine private Methode, weil keine andere Klasse, einschließlich einer abgeleiteten Klasse kann sagen, dass es existiert. Es ist private.
Private Methoden sind implizit
final
.Auf ein zugehöriger Hinweis eine Unterklasse deklarieren Sie ein Feld oder eine Methode mit demselben Namen wie eine
private
Feld oder eine Methode in einer super-Klasse, weil von der Unterklasse s point of view, diese Mitglieder nicht existieren. Es gibt keine Besondere Beziehung zwischen diesen Mitglieder.Für geschachtelte Klassen, beliebigen code innerhalb der äußeren Klasse Programm, text, weiß, dass die private Methode existiert. Siehe meine Antwort ein Beispiel für die könnte arbeiten - aber nicht.
Das ist wahr, irgendwie. Eine package-private Methode synthetisiert, die in der inneren Klasse, die Delegierten auf die private Methode. Aber aus der Programmierer-Sicht sieht es so aus als wenn die äußeren Klasse können sehen, das innere Klasse private Methode.
Es ist nicht nur aus Programmierer Sicht, es ist von den Sprache point of view. Ich würde es trennen, wie JVM vs Sprache.
Bedeutung, die Sprache ermöglicht den Zugang von der umschließenden Klassen auf private Elemente der verschachtelten, aber die Privatsphäre ist immer noch wirklich durchgesetzt werden, indem die JVM? Ich würde dem Zustimmen.
InformationsquelleAutor erickson
Nein, das können Sie nicht. Bauen Sie ein Programm, welches Aussehen, wie es sollte in der Lage sein, dies zu tun, mit der Tatsache, dass code, der innerhalb eines äußeren Klasse zugreifen können, die geschachtelte Klasse ist private Mitglieder. Die privaten Methoden immer noch nicht wirklich überschrieben werden. Beispiel:
Gegeben, dass dies die nur situation, in der es möglich war, zu überschreiben, eine private Methode, es ist kein großer Verlust, dass es nicht unterstützt wird.
Wenn Sie ändern möchten, auf das Verhalten der privaten Mitglied Ihrer Superklasse, Ihr design ist gebrochen, im Grunde.
InformationsquelleAutor Jon Skeet
Konnte ich es nicht mit Reflexion, sondern ich habe herausgefunden, einen Weg, es zu tun über die Instrumentierung. Ich habe ASM, wie vorgeschlagen, auf Dhruba Bandopadhyay s blog. Wenn Sie interessiert sind, können Sie sich mein code (es ist zu viel es hier zu posten).
InformationsquelleAutor numbers longer
Wenn Sie wirklich wollen, dies zu tun mit Reflexion, Sie könnten:
Ich vermute, Sie möchten Ihr Programm entwerfen, anders, anstatt mit diesem Ansatz. Es ist nicht performant, und es wird auf jeden Fall fangen wer extends SuperClass überraschen.
Beachten Sie, dass die Unterklasse die Methode getInt () - Methode kann privat sein, wenn Sie mithilfe von reflektion auf diese Weise. Wieder, wobei dieser Ansatz ist fast definitiv eine Schlechte Idee, zumindest für die zwei genannten Gründen. Chancen sind, können Sie Ihre Ziele zu erreichen einen anderen Weg. Paket Schutz ist nicht wirklich eine option?
InformationsquelleAutor Michael Bosworth
können Sie pass var Verweis -> Klassen, die mit java ?
weil, wenn es jemals möglich ist:
obiges problem könnte wie folgt umgeschrieben werden:
(Beachten Sie, dies ist für die Spezifikation Zweck nur)
VB:
Funktion(ByRef intX as Integer)
//Wert kann explizit geändert werden, aber nicht die Methode selbst 😛
end function
so viel mehr wie, dass ich denke...
InformationsquelleAutor i am ArbZ
Nein, sind wir nicht ändern können Private Methoden, aber es gibt einen Fall, wo wir außer Kraft setzen können private Methoden zu, d.h. die Innere Klasse
}
InformationsquelleAutor Rahul Maurya
Können Sie nicht überschreiben Sie eine private Methode, aber Sie können sich vorstellen/neu definieren in einer abgeleiteten Klasse.Wie:
In dieser sind Sie nicht überschreiben dieser fun() in der abgeleiteten Klasse definieren Sie eine neue Methode mit dem gleichen Namen, aber wenn Sie versuchen, die Verwendung von @override über die top-Spaß() Kind-Klasse, als Sie erhalten compile-Zeit-Fehler, weil Sie zwingen, dies zu ändern fun() sonst sind Sie nur die Neudefinition der neue Spaß() Kind-Klasse
InformationsquelleAutor Moni
Können Sie nicht überschreiben Sie eine private Methode.
Eine überschreibende Methode kann nur existieren in der Unterklasse die überschriebene Methode. Wenn die Methode, die Sie überschreiben möchten markiert ist private, überschreiben, es ist nicht möglich, da die Unterklasse Erben nicht alles markiert private, also dem Kappen der verbindungen zwischen privaten Methode und alles, was in der Unterklasse, einschließlich der Unterklasse Methoden.
Zu "überschreiben" bedeutet, dass die JVM zu bestimmen, welche Methode zu verwenden, basierend auf der Instanz geben, die Sie aufrufen, es mit. Die Theorie des Polymorphismus erklärt, was dies möglich macht. Um für die JVM in der Lage sein zu sagen "mit diesen Methoden verbunden sind, die eine überschreibt den anderen", die JVM muss in der Lage sein, um anzeigen der überschrieben Methode innerhalb der Unterklasse enthält die überschreiben Methode.
Dass gesagt wird, die Klassen in dem Fall werden noch kompilieren, aber weder von den Methoden aufgerufen werden, die auf der Grundlage der JVMs, die unabhängig voneinander laufen, Instanz-basierten Aufruf. Sie werden lediglich unterschiedliche Methoden zusammen, die nicht anerkannt werden von der JVM als außer Kraft gesetzt oder überschreiben.
Außerdem, wenn Sie eine IDE wie NetBeans, mit der @Override-annotation weist den compiler, dass Sie das überschreiben der Methode mit der gleichen Signatur in der Unterklasse. Wenn Sie dies nicht tun, erhalten Sie eine Warnung, die darauf hindeutet, dass Sie die annotation. Sie erhalten einen Kompilierungsfehler, wenn Sie jedoch gelten diese Anmerkung, wenn:
ODER
Finden Sie in der offiziellen Oracle Dokumentation https://docs.oracle.com/javase/tutorial/java/IandI/override.html
für den folgenden Auszug:
Überschreiben kann sehr verwirrend sein, weil es sich um die JVM handeln scheinbar unabhängig. Denken Sie daran, dass ohne Zugriff auf die Methode[s] in der Oberklasse (in anderen Worten, für alle Methoden markiert private), die Unterklasse kann nicht aufrufen oder überschreiben dieser Methode[s], denn es können nicht Erben, Sie zu tun.
InformationsquelleAutor We_are_the_Borg_
Lesen Sie diese sorgfältig,
PRIVATE Methoden werden NICHT VERERBT... Da Sie nicht vererbt werden, Sie kann NICHT ÜBERSCHRIEBEN WERDEN
InformationsquelleAutor Kumar Vivek Mitra