2010-12-22 10 views
0

Ich versuche, in Java-Anwendung groovy einzubetten und bekam ein seltsames Problem. Lassen Sie uns sagen, dass ich diese Klasse in groovy Skript definiert haben:Variable der gleichen Klasse in separaten Kontexten

class MyClass { 
    String a; 
} 

Dann ist es ich instanziieren und es ausdrückte in Rahmen meiner Anwendungskontext (Map<String, Object> in meinem Haupt-Anwendung gespeichert und eine gemeinsame Lagerung zwischen Skripte bereitstellen).

MyClass c = new MyClass() 
c.a = "Hello world!" 
appContext.share.put("myclass.instance",c) 

Dann in anderen Skript (dh getrennt, läuft mit einem eigenen Kontext, sondern aus den gleichen Quellen einschließlich MyClass.groovy-Datei), ich versuche, die Variable zu lesen zurück:

MyClass c = (MyClass) appContext.share.get("myclass.instance") 

Und erhalten Sie eine spektakuläre Ausnahme dafür, dass Sie die MyClass-Instanz nicht in MyClass umwandeln können :).

Grundsätzlich verstehe ich, was könnte das Problem sein, jedes Mal, wenn ich das Skript kompilieren erstellt es neue Instanzen von Klassen mit unterschiedlichen IDs aber gleichen Namen, und sie sind miteinander inkompatibel. Die Frage ist, wie kann ich tun, was ich versuche, ohne alle gemeinsamen Objekte zu serialisieren/deserialisieren und ohne Reflektion zu verwenden?

Es ist zu beachten, dass ich die MyClass-Klasse nicht in Java-Code verschieben kann, es muss im Skript bleiben, da es Teil der Skriptlogik ist.

Vielen Dank im Voraus.

Antwort

1

Was ist, wenn Sie versuchen, mit appContext.share.get("myclass.instance") as MyClass zu gießen? as führt eine "härtere" Besetzung aus, es kann sogar Map in eine Klasse umwandeln. Es ist wie c.properties = appContext.share.get("myclass.instance").properties.

0

Das erste, was vorschlagen - können Sie Groovy Dynamik nutzen und Typdeklaration in zweiten Fall vermeiden:

def c = appContext.share.get("myclass.instance") 

jedoch unter der Haube wird es Reflexion verwenden, wie ich sie verstehe.

Verwandte Themen