Переменная одного и того же класса в разных контекстах - PullRequest
0 голосов
/ 22 декабря 2010

Я пытаюсь вставить Groovy в Java-приложение и получил странную проблему. Допустим, у меня есть этот класс, определенный в groovy script :

class MyClass {
    String a;
}

Затем я создаю его экземпляр и помещаю в контекст контекста моего приложения (Map<String, Object> хранится в моем основном приложении и обеспечивает общее хранилище между скриптами).

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

Затем в другом скрипте (который запускается отдельно, со своим собственным контекстом, но из тех же источников, включая файл MyClass.groovy), я пытаюсь прочитать переменную обратно:

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

И получите исключительное исключение из-за невозможности привести экземпляр MyClass к MyClass :).

В принципе, я понимаю, в чем может быть проблема, каждый раз, когда я компилирую скрипт, он создает новые экземпляры классов с разными идентификаторами, но одинаковыми именами, и они несовместимы друг с другом. Вопрос в том, как мне сделать то, что я пытаюсь сделать, без сериализации / десериализации всех общих объектов и без использования отражения?

Следует отметить, что я не могу переместить класс MyClass в код Java, он должен оставаться в сценарии, поскольку он является частью логики сценария.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 22 декабря 2010

Что, если вы попробуете кастовать с appContext.share.get("myclass.instance") as MyClass?as выполняет более "суровое" приведение, оно может даже привести Map к классу.Это как c.properties = appContext.share.get("myclass.instance").properties.

0 голосов
/ 22 декабря 2010

Первое, что можно предложить - вы можете использовать динамическую природу Groovy и избегать объявления типов во втором случае:

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

Однако, как я понимаю, под капотом будет использоваться отражение.

...