我正在尝试在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代码,它必须保留在脚本中,因为它是脚本逻辑的一部分。
提前致谢。
答案 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")
然而,根据我的理解,它会使用反射。