【问题标题】:Variable of same class in separate contexts不同上下文中同一类的变量
【发布时间】:2010-12-22 15:38:21
【问题描述】:

我正在尝试在 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 代码中,它必须保留在脚本中,因为它是脚本逻辑的一部分。

提前致谢。

【问题讨论】:

    标签: java groovy embedding


    【解决方案1】:

    如果您尝试使用 appContext.share.get("myclass.instance") as MyClass 进行投射会怎样? as 执行更“苛刻”的转换,它甚至可以将 Map 转换为一个类。就像c.properties = appContext.share.get("myclass.instance").properties。

    【讨论】:

      【解决方案2】:

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

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

      但是,据我所知,它会在底层使用反射。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-03
        相关资源
        最近更新 更多