Hallo,
folgendes Szenario: Auf einem Frame ist unter anderem ein Panel. Dieses Panel soll nun zur Laufzeit ausgetauscht werden. Allerdings nicht mit einer zur Compilezeit bekannten Klasse, sondern dynamisch.
Der Kontext ist Modelgetriebene Softwareentwicklung. Wir haben eine GUI-Beschreibungssprache entwickelt. Aus diesen Modellen generieren wir Java Source Code. Leider müssen wir jetzt für jede Vorschau der GUI immer wieder generieren, compilieren und die VM neu anstarten. Das dauert. Und alles nur für ein Panel, das sich geändert hat. Es geht also um Performance.
Also: wie kann ich Klassen (neue Panels) dynamisch laden bzw. bestehende Klassen manipulieren (eine Methode (setLayout()) des Panels)?
Ich habe bereits einige Lösungsansätze erfolgreich ausprobiert:
1) Mit Runtime.exec("javac bla.java") selbst eine neues java-file kompiliert und in die VM laden. Funzt, ist aber ätzend langsam
2) Javaassist Framework: Dieses (eigentlich Bytecodemanipulations-) Framework bietet einen eingebauten Compiler mit dem man nur kleine Snippets (einen Methodenrumpf) compilieren kann. Ich nehme mir das bestehende Panel, tausche die Methoden aus und lade die neue Klasse in die VM. funtz, ist auch schon 3x so schnell wie 1)
3) Bytecode-Engineering mit ASM Framework: Ich manipuliere den Bytecode des bestehenden Panels und schreibe die Methode neu. Wahnsinnig schnell (da keine Compilation), jedoch aufgrund der bytecodenähe sehr anspruchsvoll und fehleranfällig.
Hab ihr noch weitere Idee, Anregungen oder Gedanken dazu? Ich probiere gerne neue Sachen aus.
Können andere Sprachen (wie Scala) hier vlt. weiter helfen? Kann man lebende Objekte manipulieren (vlt. mit irgendwelchen Frameworks)?
mfg
Skalar
folgendes Szenario: Auf einem Frame ist unter anderem ein Panel. Dieses Panel soll nun zur Laufzeit ausgetauscht werden. Allerdings nicht mit einer zur Compilezeit bekannten Klasse, sondern dynamisch.
Der Kontext ist Modelgetriebene Softwareentwicklung. Wir haben eine GUI-Beschreibungssprache entwickelt. Aus diesen Modellen generieren wir Java Source Code. Leider müssen wir jetzt für jede Vorschau der GUI immer wieder generieren, compilieren und die VM neu anstarten. Das dauert. Und alles nur für ein Panel, das sich geändert hat. Es geht also um Performance.
Also: wie kann ich Klassen (neue Panels) dynamisch laden bzw. bestehende Klassen manipulieren (eine Methode (setLayout()) des Panels)?
Ich habe bereits einige Lösungsansätze erfolgreich ausprobiert:
1) Mit Runtime.exec("javac bla.java") selbst eine neues java-file kompiliert und in die VM laden. Funzt, ist aber ätzend langsam
2) Javaassist Framework: Dieses (eigentlich Bytecodemanipulations-) Framework bietet einen eingebauten Compiler mit dem man nur kleine Snippets (einen Methodenrumpf) compilieren kann. Ich nehme mir das bestehende Panel, tausche die Methoden aus und lade die neue Klasse in die VM. funtz, ist auch schon 3x so schnell wie 1)
3) Bytecode-Engineering mit ASM Framework: Ich manipuliere den Bytecode des bestehenden Panels und schreibe die Methode neu. Wahnsinnig schnell (da keine Compilation), jedoch aufgrund der bytecodenähe sehr anspruchsvoll und fehleranfällig.
Hab ihr noch weitere Idee, Anregungen oder Gedanken dazu? Ich probiere gerne neue Sachen aus.
Können andere Sprachen (wie Scala) hier vlt. weiter helfen? Kann man lebende Objekte manipulieren (vlt. mit irgendwelchen Frameworks)?
mfg
Skalar