2008-09-03 14 views
3

Ein Kollege wies mich neulich auf BCEL was, wie ich am besten anhand seiner Erklärung und einer kurzen Lektüre sagen kann, eine Möglichkeit, zur Laufzeit den Byte-Code zu ändern. Mein erster Gedanke war, dass es sich gefährlich anhört, und mein zweiter Gedanke war, dass es cool klang. Dann dachte ich noch einmal darüber nach und erinnerte mich an die codinghorror post on monkey-patching und erkannte, dass dies im Grunde dasselbe war. Hat jemand jemals BCEL für etwas Praktisches benutzt? Habe ich Recht, dass das im Grunde genommen Zeit ist, Affen zu flicken, oder fehle ich etwas?Ist BCEL == Monkeypatching für Java?

+0

In diesen Tagen benutzen mehr Leute asm (http://asm.ow2.org/). –

Antwort

1

Es ist ein wenig low-level als klassisches Monkey Patching, und von dem, was ich lese, werden die Klassen, die bereits in die VM geladen sind, nicht aktualisiert. Es wird nur unterstützt, es erneut in Klassendateien zu speichern und keine Laufzeitklassen zu ändern.

3

Von BCEL Häufig gestellten Fragen:

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

A: BCEL enthält nützliche Klassen im util-Paket, nämlich Classloader und JavaWrapper.Take ein Blick auf die ProxyCreator Beispiel.

Aber monkeypatching ist ... uhm ... 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 vorschlagen, Jython zu verbalisieren?

0

Sie könnten es als Affenflicken betrachten. Ich bevorzuge es nicht zu benutzen (vielleicht habe ich nie einen guten Anwendungsfall dafür gesehen?), Aber sei damit vertraut (um eine Vorstellung zu haben, wie Spring und Hibenrate es benutzen und warum).

0

Sehen Sie dieses reale Beispiel: Jawk - Compiler Module. BCEL ist nützlich für die "Kompilierung" Ihrer eigenen Sprache.

0

BCEL unterstützt kein Affe-Patching, es manipuliert nur mit Bytecode und lädt es möglicherweise in einen benutzerdefinierten Classloader. Sie können jedoch monkeypatching auf JVM mit Bibliothek wie BCEL und Java-Agent implementieren. Der Java-Agent (geladen mit Argument -javaagent) kann auf die Instrumentation-API zugreifen und geladene Klassen ändern. Es ist nicht schwer, es über einige Brücken zu implementieren.

Aber denken Sie daran:

  • Ich bin nicht sicher, ob -javaagent verwenden etwas, das Sie wollen.
  • In jeder Sprache kann Affepatching 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 gegen modifizierte (gepatchte) Klassen kompilieren. Ich denke, das würde eine Menge Schmerz verursachen und es ist es nicht wert. Es gibt alternative Sprachen, die es unterstützen (z. B. Groovy) oder etwas Ähnliches unterstützen (z. B. implizite Konvertierungen in Scala).
  • Es ist besser, Ihre API gut zu entwickeln, als Affen-Patching zu verwenden. Es kann für Bibliotheken von Drittanbietern ziemlich nützlich sein.