在不同的上下文中相同类的变量

时间:2010-12-22 15:38:21

标签: java groovy embedding

我正在尝试在java应用程序中嵌入groovy并遇到一个奇怪的问题。假设我在groovy脚本中定义了

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的壮观异常:)。

基本上我理解可能是什么问题,每次编译脚本时它都会创建具有不同ID但名称相同的类的新实例,并且它们彼此不兼容。问题是,如果不对所有共享对象进行序列化/反序列化并且不使用反射,我该怎样做我想做的事情?

必须注意的是,我不能将MyClass类移动到Java代码,它必须保留在脚本中,因为它是脚本逻辑的一部分。

提前致谢。

2 个答案:

答案 0 :(得分:1)

如果您尝试使用appContext.share.get("myclass.instance") as MyClass进行投射怎么办? as执行更“严厉”的演员,它甚至可以将Map投射到一个类。它就像c.properties = appContext.share.get("myclass.instance").properties

答案 1 :(得分:0)

首先要建议的是 - 你可以使用Groovy的动态特性并在第二种情况下避免类型声明:

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

然而,根据我的理解,它会使用反射。