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)
以返回新生成的类,该类是基类的代理。