Kann bei OSGi eine Bytecode-Manipulation vorgenommen werden?

8

Ich mache einen Anwendungsserver und in diesem muss ich einige Bytecode-Manipulationen verwenden (zB das Einfügen von benutzerdefinierten equals und hashCode Methoden zu Klassen, die mit @Entity ) kommentiert wurden. Jetzt gebe ich der JVM einen Java-Agenten (die Option -javaagent ), die Bytecode-Transformationen mit < a href="http://asm.objectweb.org/"> ASM .

Ich habe überlegt, OSGi zu verwenden, aber ich weiß nicht, ob es mir erlaubt, den notwendigen Bytecode zu machen Manipulation.

  1. Ist es möglich, bei der Verwendung von OSGi eine Bytecode-Manipulation durchzuführen? Wie?
  2. Ist es möglich, dass sich ein Bündel selbst erklärt, dass es eine Bytecode-Manipulation erfordert, damit es funktioniert? Zum Beispiel erfordert der Anwendungsserver, dass einige seiner eigenen Kernklassen manipuliert werden.
  3. Ist es möglich, festzulegen, dass ein anderes Paket eine Bytecode-Manipulation erfordert, ohne dass das Paket davon weiß? Zum Beispiel müssen alle Anwendungen, die auf dem Server laufen, manipuliert werden, aber die Anwendungen müssen nichts darüber wissen.
  4. Ist es möglich, dass sich ein Bündel selbst erklärt, dass alle Bündel, die davon abhängen, bytecode-manipuliert werden müssen? Dies würde es für mich leicht machen, zu erklären, dass alle, die von dem API-Bündel abhängen, das die @Entity -Anmerkung enthält, manipuliert werden müssen.
Esko Luontola 18.02.2009, 23:18
quelle

2 Antworten

6

OSGi 4.3 hinzugefügt, um die WeavingHook , die Ihnen erlaubt, do-Byte-Code-Manipulation mit einem Byte-Code-Manipulator Ihrer Wahl. Ich benutze es mit JavaAssist auf einem meiner Projekte und es funktioniert super.

    
rancidfishbreath 25.10.2011 19:55
quelle
3

1) Ja, es ist möglich, eine Bytecode-Manipulation in OSGi durchzuführen. Das Wie ist ein bisschen anders als mit Standard-Java, müssen Sie das Extender-Muster hier beschreiben Ссылка . Ich glaube, dass Eclipse das in ihrem Projekt für Tag-Nacht-Gleiche verwendet: Ссылка . Spring DM verwendet definitiv dieses Muster, um osgi dm module automatisch zu konfigurieren.

2), das wäre das Extender-Muster, das Sie verwenden. So funktioniert der Feder-Extender, indem er im Ordner META-INF / spring nach Konfigurationsdateien sucht, bevor diese von der Plattform gestartet werden.

3) Das wäre wiederum der von Ihnen definierte Extender.

4) Ich glaube, das wäre möglich, denn bevor ein Bündel gestartet werden kann, muss es aufgelöst und Abhängigkeiten gestartet werden. Ihr Extender könnte dann Bündelabhängigkeiten analysieren und die Bytecode-Manipulation starten.

    
Patrick Roumanoff 19.02.2009 02:48
quelle