Frage

Ein Kollege hat mich neulich darauf hingewiesen BCEL Dies ist, wie ich aus seiner Erklärung und einer kurzen Lektüre am besten ersehen kann, eine Möglichkeit, den Bytecode zur Laufzeit zu ändern.Mein erster Gedanke war, dass es gefährlich klang, und mein zweiter Gedanke war, dass es cool klang.Dann dachte ich noch einmal darüber nach und erinnerte mich daran Codinghorror-Beitrag zum Monkey-Patching und erkannte, dass dies im Grunde dasselbe war.Hat jemand jemals BCEL für irgendetwas Praktisches verwendet?Habe ich recht, dass es sich im Grunde genommen um Affenpatches zur Laufzeit handelt, oder übersehe ich etwas?

War es hilfreich?

Lösung

Es ist etwas einfacher als das klassische Monkey-Patching, und soweit ich gelesen habe, werden die bereits in die VM geladenen Klassen nicht aktualisiert.Es unterstützt nur das erneute Speichern in Klassendateien, nicht das Ändern von Laufzeitklassen.

Andere Tipps

Aus den FAQ von BCEL:

Q:Kann ich Klassen dynamisch mit BCEL erstellen oder ändern?

A:BCEL enthält nützliche Klassen im Util -Paket, nämlich Classloader und Javawrapper. Schauen Sie sich das Beispiel für das Proxycreator an.

Aber Monkeypatching ist...ähm...umstritten, und Sie sollten es wahrscheinlich nicht verwenden, wenn Ihre Sprache es nicht unterstützt.

Wenn Sie einen guten Anwendungsfall dafür haben, kann ich dann die Einbettung von Jython vorschlagen?

Man könnte es als Affenflicken betrachten.Ich ziehe es vor, es nicht zu verwenden (vielleicht habe ich nie einen guten Anwendungsfall dafür gesehen?), sondern mich damit vertraut zu machen (um eine Vorstellung davon zu bekommen, wie Spring und Hibenrate es verwenden und warum).

Sehen Sie sich dieses Beispiel aus der Praxis an: Jawk – Compiler-Modul.BCEL ist nützlich für die „Kompilierung“ Ihrer benutzerdefinierten Sprache.

BCEL unterstützt kein Monkey-Patching, sondern manipuliert lediglich den Bytecode und lädt ihn möglicherweise in einen benutzerdefinierten Klassenlader.Aber du kann Monkeypatching auf JVM implementieren Verwendung von Bibliotheken wie BCEL und Java-Agent.Der Java-Agent (geladen durch das Argument -javaagent) kann auf die Instrumentierungs-API zugreifen und geladene Klassen ändern.Es ist nicht schwer, es über einige Brücken zu implementieren.

Aber erinnere dich:

  • Ich bin mir nicht sicher, ob Sie die Verwendung von -javaagent wünschen.
  • In jeder Sprache kann das Patchen von Affen zu schlecht vorhersehbarem Verhalten führen.
  • Sie können eine Methode ändern.Theoretisch können Sie auch eine Methode hinzufügen, aber Sie müssen das Projekt anhand geänderter (gepatchter) Klassen kompilieren.Ich denke, das würde große Schmerzen verursachen und ist es nicht wert.Es gibt alternative Sprachen, die dies unterstützen (z. B.Groovy) oder etwas Ähnliches unterstützen (z.B.implizite Konvertierungen in Scala).
  • Es ist besser, Ihre API gut zu entwerfen, als Monkey-Patching zu verwenden.Es kann für Bibliotheken von Drittanbietern recht nützlich sein.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top