Ich muss Methoden auf verschiedenen Ansichtsklassen im Android UI Framework wie TextView
Proxy-Methoden. Insbesondere TextView#setText(int resId)
. Diese Methode ist nicht Teil einer Schnittstelle. Daher wird Java Proxy nicht funktionieren, da es nur für Schnittstellen funktioniert. Ich muss Bytecode-Manipulation verwenden.Endgültige Proxy-Methode in nicht abschließender Klasse
fand ich eine Bibliothek namens dexmaker, die vielversprechend schien. Ich gehe davon aus, dass ich Laufzeit-Byte-Code manipulieren muss, da die Android View-Klassen nur auf dem Gerät verfügbar sind. Dexmaker kann öffentliche Methoden auf konkrete Klassen anwenden. Dann habe ich bemerkt, dass TextView#setText(int resId)
unerklärlicherweise final ist. Die Klasse TextView
selbst ist nicht endgültig.
Ich glaube, ich dexmaker Gabel könnte endgültige Methoden in nicht-finalen Klassen zu unterstützen. Ist das möglich? Ich möchte dieses Projekt nicht starten, wenn es nicht ist. Es wäre jedoch ein großer Gewinn für meine Bibliothek, da Entwickler für ihre Ansichten keine Unterklassen, Schnittstellen oder manuelle statische Methodenaufrufe benötigen würden. Meine Bibliothek muss wissen, wann Text für eine bestimmte Ansicht festgelegt wurde. Ein Proxy ist das perfekte Designmuster dafür.
Random Schuss (da es nicht erwähnt wird): Ein Layout Inflater ermöglicht [eine Factory-Klasse festlegen] (http://developer.android.com/reference/android/view/LayoutInflater. html # setFactory2 (android.view.LayoutInFlater.Factory2)) das könnte sein, wonach Sie suchen. Dies wird in [Probe] (https://github.com/lucasr/probe/) verwendet, wo die Factory mit dexmaker zum Abfangen von Anrufen dynamisch Proxys erstellt. –
Ein Teil meiner Bibliothek verwendet tatsächlich die Layout-Inflatter-Factory-Technik. Sie sagen, Sie können dort auf den über dexmaker angelegten View-Objekten einen Proxy einrichten? – jophde
Vielen Dank Stefan. Die Probequelle ist genau das, was ich brauchte :). Wenn ich das richtig verstanden habe, erstellt Probe völlig neue View-Klassen, so dass die Dexmaker-Beschränkung von Proxybuild, mit finalen Methoden nicht umgehen zu können, kein Problem ist. Von dexmaker ProxyBuilder docs: "Dieser Prozess funktioniert nur für Klassen mit öffentlicher und geschützter Sichtbarkeitsebene." – jophde