Groovy "as" 运算符是否在 运行 时间为用户定义的 类 创建子类?

Does Groovy "as" operator create a subclass at run time for User defined classes?

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

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

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

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

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

我看过其他堆栈溢出文章,我了解到 Groovy 使用 DefaultGroovyMethods.java 和 DefaultTypeTransformation.java 进行强制转换。但无法弄清楚它是否是 subclassing 或不是。

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

的代理 class
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]>

在您的案例中具体发生的情况如下: