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



In 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来进行强制。但无法弄清楚它是否是子类。

是的,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]>

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

  • asType方法转到第 11816 行执行ProxyGenerator.INSTANCE.instantiateAggregateFromBaseClass(map, clazz);
  • 在下一步中,将创建ProxyGeneratorAdapter对象。
  • 在最后一步中,调用adapter.proxy(map,constructorArgs)以返回新生成的类,该类是基类的代理。

相关内容

  • 没有找到相关文章

最新更新