2013-04-12 21 views
17

Ich habe eine statische Methode in einigen Legacy-Code, der von mehreren Clients aufgerufen wird. Ich habe offensichtlich keine Optionen, um es zu überschreiben oder das Verhalten durch die Abhängigkeitsinjektion zu ändern. Ich bin nicht berechtigt, die vorhandene Klasse zu ändern.Wie ändert man das Methodenverhalten durch Reflektion?

Was ich jetzt tun möchte, ist das Verhalten (diese Methode - mit der gleichen Signatur und Rückgabetyp) mit Reflektion zu ändern.

Ist es möglich? Wenn nicht, kann irgendein Entwurfsmuster mich retten?

Danke!

EDIT: Es gibt einige Verwirrung, was ich ändern/ändern kann. Ich kann keine vorhandene Klasse/Methode ändern - aber ich kann dem Projekt weitere Klassen hinzufügen. Das Beste, was ich mit den vorhandenen Klassen tun kann, ist, sie mit Anmerkungen zu versehen. Dies alles wird getan, um zu vermeiden, dass irgend etwas in dem existierenden Code bricht - was eine komplette Testreihe für ein großes Projekt bedeutet.

EDIT 2: java.lang.Instrumentation ist nicht für Android verfügbar - oder es klingt wie eine gute Passform!

+0

Warum Reflexion? –

+3

Sie dürfen es nicht ändern, aber Sie dürfen es durch Reflektion ändern? Das scheint viel gefährlicher zu sein. – Keppil

+0

Ich denke, das wird in einem Wartungsalbtraum enden. Der Code wird jeden belesen, der es liest. Geh und erhalte die Genehmigung, diese Klasse zu ändern. – SpaceTrucker

Antwort

18

Klingt wie eine seltsame Anforderung ...

Wie dem auch sei, Reflexion ermöglicht es Ihnen nicht Code Verhalten zu ändern, kann es nur aktuelle Code erkunden, rufen Sie Methoden und constuctors, ändern Felder Werte, diese Art von Dingen.

Wenn Sie das Verhalten einer Methode tatsächlich ändern möchten, müssten Sie eine Bytecode-Manipulationsbibliothek wie ASM verwenden. Aber das wird nicht sehr einfach sein, wahrscheinlich keine gute Idee ...

Patterns, die Ihnen helfen:

  • Wenn die Klasse nicht endgültig ist und Sie können die Kunden verändern, erweitern die bestehende Klasse und Überlasten Sie die Methode mit Ihrem gewünschten Verhalten. Edit: das würde nur funktionieren, wenn die Methode nicht statisch wäre!
  • Aspect Programmierung: add Abfangjäger der Methode AspectJ mit

Wie auch immer, die logischste Sache zu tun wäre, einen Weg zu finden, die bestehenden Klasse, Umgehungen zu modifizieren wird nur der Code komplizierter machen und schwerer zu pflegen.

Viel Glück.

+0

Die Methode, die statisch ist, kann nicht überschrieben werden. Ich frage mich, ob Reflexion Feldwerte verändern kann, warum nicht Methoden! – SlowAndSteady

+0

Ich bin neu in AOP. Erforsche es jetzt! – SlowAndSteady

+0

Sie haben Recht, dass die Methode natürlich statisch ist. Ich habe meine Antwort entsprechend bearbeitet. –

8

Ich denke, Sie könnten sich Instrumentation Klasse ansehen, die eine Methode redefineClasses(ClassDefintion classDefinition) haben.

Die Neudefinition kann die Methodenkörper, den Konstantenpool und die Attribute ändern. Die Neudefinition darf keine Felder oder Methoden hinzufügen, entfernen oder umbenennen, die Signaturen von Methoden ändern oder die Vererbung ändern.

Hoffe, das hilft.

Referenzen: Javadoc

+0

Entschuldigung, habe vergessen hinzuzufügen, das ist Android. Ich habe nicht diese Klasse in Anspruch zu nehmen :( – SlowAndSteady

Verwandte Themen