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]>
在您的案例中具体发生的情况如下:
asType
方法去line 11816执行ProxyGenerator.INSTANCE.instantiateAggregateFromBaseClass(map, clazz);
- 在下一步中,
ProxyGeneratorAdapter
对象被创建。
- 在最后一步中,
adapter.proxy(map,constructorArgs)
被调用到 return 新生成的 class,它是基础 class. 的代理
在 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 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
方法去line 11816执行ProxyGenerator.INSTANCE.instantiateAggregateFromBaseClass(map, clazz);
- 在下一步中,
ProxyGeneratorAdapter
对象被创建。 - 在最后一步中,
adapter.proxy(map,constructorArgs)
被调用到 return 新生成的 class,它是基础 class. 的代理