Wie wollen Sie den Zugriff auf geschützte Java-Methode in thirdparty Bibliothek?
Davon ausgehen muss, dass Sie Zugriff auf eine geschützte Methode von einem Java-Objekt, das Sie erhalten, irgendwo in deinem code. Was ist Ihre Lösung?
Ich weiß, ein Ansatz: die Sie einsetzen können, - Reflexion und-nennen setAccessible(true) auf die Methode Objekt.
Andere Idee?
Arbeiten Sie mit einer Bibliothek, eine API veröffentlicht? Wenn ja, add, info, Frage, Sie werden eine bessere Hilfe zu bekommen.
Es ist nicht das erste mal, dass ich dieses Problem, auftreten wenn Sie aber neugierig sind: Eclipse-Debug-Plugin, JDILocalVariable, getStackFrame. Url: docjar.com/docs/api/org/eclipse/jdt/internal/debug/core/model/...
Es ist nicht das erste mal, dass ich dieses Problem, auftreten wenn Sie aber neugierig sind: Eclipse-Debug-Plugin, JDILocalVariable, getStackFrame. Url: docjar.com/docs/api/org/eclipse/jdt/internal/debug/core/model/...
InformationsquelleAutor salman.mirghasemi | 2011-06-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als pro die java-zugriffsmodifizierer, neben erweitern Sie das Objekt (das können Sie nicht, wenn Sie das Objekt empfangen) ist, um es von einem Objekt im gleichen Paket wie das Objekt, das Sie erhalten. Damit Ihre option auf erstellen Sie eine wrapper-Klasse im gleichen Paket das ruft das Attribut über die geschützte Methode für Sie.
InformationsquelleAutor rsp
Können Sie die Unterklasse die Methode, erstellen Sie eine öffentliche Methode, ruft die protected-Methode und gibt das Ergebnis zurück.
Wenn Sie dies nicht tun können (wenn die Klasse ist final), dann setAccessible ist so ziemlich Ihre einzige Möglichkeit.
Ich nehme an, du meinst es konvertieren zu einem anderen Typ. Nein, Sie können nicht konvertieren Sie das Objekt-Typ (Klasse) zu einem anderen Objekt-Typ zur Laufzeit. Sie können wickeln Sie es in einem anderen Objekt, aber das problem mit protected access noch bleibt. Auch, wenn das Objekt generiert wird, mit spring oder hibernate oder andere Rahmenbedingungen, die Nutzung der runtime-proxying, es ist nicht garantiert, dass die Reflexion wird die Arbeit entweder. Das Ziel-proxy wird nicht mit enthalten alle Methoden, die nicht allgemein bekannt sind, in der Proxy-Klasse.
InformationsquelleAutor pap
Eine andere option ist die Erstellung einer Klasse, die Sie erweitert, dass 3rd-party-Klasse, die die protected-Methode, die Sie interessiert sind in.
und
Sie haben Zugang zu der Dritten Klasse zur compile-Zeit?
Es ist bereits erfüllt.
InformationsquelleAutor Bala R
Können Sie auch die Klasse erweitern, überschreiben Sie die Methode, und stellen Sie die überschriebene Methode public sein. Dann rufen Sie einfach super.Methode().
Das ist richtig. In diesem Fall ist die Reflexion Ihre einzige option.
InformationsquelleAutor Reverend Gonzo
Die andere Möglichkeit ist, die Klasse zu erweitern (wenn möglich) und erhalten Sie Zugriff auf die protected-Methode per Vererbung. Wenn Sie nicht das Objekt erstellen, ist dies nicht möglich, so müssten Sie es beim kompilieren würden Sie brauchen, um das Objekt selbst.
Einen fragwürdigen Lösung könnte sein, die Verwendung der Zusammensetzung. So erstellen Sie eine Klasse im selben Paket wie z.B. OtherObjectWrapper. Wie es in dem gleichen Paket, das Sie anrufen könnte, das Objekt geschützt ist, die Methode durch eine öffentliche API, die Sie setzen. Dies wird jedoch nicht empfohlen, da Sie nicht selbst das Paket, das Sie hinzufügen einer Klasse zu und Sie machen den code sehr spröde ist, z.B.
Überlegen, was die API-designer denken, wenn Sie markiert die Methode als protected? Vielleicht haben Sie nicht haben eine Ahnung, was Sie Taten, und es sollte öffentlich sein, oder, schlimmer noch, es werden sollte, package private oder private völlig. Oder vielleicht haben Sie getan, und Sie bestimmt nur code in der Packung oder durch Vererbung Zugriff auf die protected-Methode. Wenn es geschützt ist, kann es gut sein, für einen Grund, so vorsichtig sein, wie Sie vielleicht binden Sie Ihre codes, Verhalten, Verhaltensweisen, die kann sich ändern und zu brechen, Ihren code. Auch schauen, wer besitzt das Dritte Objekt ist und ob es eine bessere API für den Zugriff auf die protected-Methode die Funktionalität.
InformationsquelleAutor planetjones
Wenn Sie können setzen Sie den Aufruf von Klassen im gleichen Paket haben Sie Zugriff auf die Methode.
Diese und Erben von dieser Klasse sind die einzigen nicht-reflektierende Möglichkeiten zum Zugriff auf eine geschützte Methode.
InformationsquelleAutor Sergio
Wie gesagt, das erstellen von Unterklassen ist normalerweise der standard-Weg, um Zugriff auf diese Methode.
Andere Ansätze (wrapper im gleichen Paket, Reflexion) sollte in der Regel nicht verwendet, da wenn Sie nicht die Klasse erweitern (wegen endgültig sind) gibt es oft gute Gründe, die Zugriff auf diese Methode ist hart.
Wenn die Bibliothek ist in keinem guten Qualität, die Sie definitiv nicht haben sollte, um mit anderen Mitteln neben Unterklassen den Zugriff auf eine geschützte Methode, oder nicht den Zugang, die Methode überhaupt.
InformationsquelleAutor Thomas