2017-04-08 3 views
1

Meine Frage ist, ist es möglich, Eigenschaften oder sogar Methoden in eine bereits "Classloaded" -Klasse zu injizieren. Ich habe bereits bemerkt, dass es in Java nicht wirklich einfach ist, Eigenschaften dynamisch hinzuzufügen und jeder sagt, dass man eine Map (add property for a object dynamicly) verwenden sollte.Ändern Feld in der Klasse während der Laufzeit - Java

Gibt es eine bessere und "sauberere" Möglichkeit, eine Klasse während der Laufzeit zu ändern. Ich habe etwas über ASM gelesen, aber ich weiß nicht, ob das Besuchermuster, das von ASM verwendet wird, der optimale Weg ist, mit ihm zu arbeiten.

Bei ASM das Beste ist, um dieses Problem zu umgehen, gibt es keine Dokumentation neben dem auf der ASM-Website zur Verfügung gestellt (http://download.forge.objectweb.org/asm/asm4-guide.pdf)

+0

Was wäre der Anwendungsfall dafür? –

+0

Ich war ziemlich beeindruckt von Spring & Co und ich dachte, warum nicht versuchen, etwas gleich zu kodieren, nur um mehr über java.reflection und den Prozess zu erfahren, der hinter solch einem großartigen Framework stehen könnte. Kurz: Ich möchte neue Dinge lernen –

+1

Soweit ich mich erinnere von jemandem von ZeroTurnaround (wer macht JRebel) Hinzufügen von Feldern und Methoden zu bestehenden Klassen ist wirklich schwer und erfordert Workarounds wie tatsächlich die gesamte Klasse mit einem neuen auszutauschen und dann alle Links zur Klasse aktualisieren. Versuche, den Vortrag online zu finden, werde ich aktualisieren. –

Antwort

2

Sobald eine Klasse von der JVM geladen worden ist, ist es nicht möglich, modifiziere es.

Ihre beste Wette ist es, die Klasse zu ändern, dann laden Sie eine neue Kopie ... in einem anderen Klassenlader. Sie erhalten zwei Versionen der Klasse (mit verschiedenen Laufzeittypen!). Alle Instanzen der ersten Version der Klasse haben nicht die neuen Felder, Methoden und so weiter.

Mein Ratschlag ... tun Sie es nicht. Stellen Sie sich eine andere Möglichkeit vor, das zu implementieren, was Sie hier eigentlich tun möchten. Wenn das Ändern von Klassen im laufenden Betrieb für Ihre Anwendung von grundlegender Bedeutung ist, sollten Sie eine dynamischere Sprache verwenden.

+0

Vielen Dank für Ihre Antwort –

Verwandte Themen