【问题标题】:Does Groovy "as" operator create a subclass at run time for User defined classes?Groovy“as”运算符是否在运行时为用户定义的类创建子类?
【发布时间】:2019-12-12 12:40:00
【问题描述】:

在 Groovy 中当我在 groovy 脚本中编写以下代码时。

class Emp {
    public String getId() {
         return "12345";
    }
}

def coercedInstance = [ 
   getId: {
     "99999"
    }
] as Emp

println new Emp().getId()
println coercedInstance .getId()

在这里使用 as 运算符,我是在运行时创建实际 Emp 类的子类并在运行时提供方法体吗?

我看过其他堆栈溢出文章,并且我了解到 Groovy 使用 DefaultGroovyMethods.java 和 DefaultTypeTransformation.java 来执行强制转换。但无法弄清楚它是否是子类化。

【问题讨论】:

    标签: groovy coercion


    【解决方案1】:

    是的,as 运算符创建一个对象,该对象的类型是目标类的子类。使用DefaultGroovyMethods.asType(Map map, Class clazz) 生成(在内存中)一个扩展给定基类的代理类。

    class Emp {
    
        public String getId() {
            return "12345";
        }
    }
    
    def coercedInstance = [
        getId: {
            "99999"
        }
    ] as Emp
    
    assert (coercedInstance instanceof Emp)
    assert (coercedInstance.class != Emp)
    assert (Emp.isAssignableFrom(coercedInstance.class))
    
    println coercedInstance.dump() // <Emp1_groovyProxy@229c6181 $closures$delegate$map=[getId:coercion$_run_closure1@7bd4937b]>
    

    您的具体情况如下:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 2012-06-13
      • 2010-10-16
      • 2020-10-10
      • 1970-01-01
      相关资源
      最近更新 更多