我正在学习groovy,无法理解下面这段代码的语句。搜索其他相关文档,但没有运气。有人可以帮助这里吗?谢谢。第一个月代码片段:
import groovy.transform.Field @Field List awe = [1, 2, 3] def awesum() { awe.sum() } assert awesum() == 6
字符串
tjrkku2a1#
在编译期间,groovy将脚本转换为扩展groovy.lang.Script的java类。因此,所讨论的代码将近似转换为:
public class scriptXYZ extends groovy.lang.Script { java.util.List awe public scriptXYZ() { awe = [1, 2, 3] } public java.lang.Object run() { assert this.awesum() == 6 } public java.lang.Object awesum() { return awe.sum() } }
字符串如果没有@Field注解,变量awe将成为run()方法的一部分,显然awesum()函数将抛出错误:
@Field
awe
run()
awesum()
public class scriptXYZ extends groovy.lang.Script { public scriptXYZ() { } public java.lang.Object run() { List awe = [1, 2, 3] assert this.awesum() == 6 } public java.lang.Object awesum() { return awe.sum() } }
型在groovyconsole中,您可以选择菜单Script -> Inspect AST来查看为脚本生成的类
groovyconsole
Script -> Inspect AST
的数据
kqhtkvqz2#
供参考的报价和代码中的问题是从Javadoc of @Field .完整的一部分:变量注解,用于将脚本中变量的范围从脚本的run方法内更改为脚本的类级别。带注解的变量将成为脚本类的私有字段。字段的类型将与变量的类型相同。示例用法:
字符串在这个例子中,如果没有annotation,变量awe将是一个本地脚本变量(从技术上讲,它将是脚本类的run方法中的本地变量)。这样的本地变量在awesum方法中不可见。使用annotation,awe将成为脚本类中的私有List字段,并在awesum方法中可见。需要它的原因以及“脚本”在这里的含义可以通过“反汇编”生成的“groovy脚本”(一个只包含示例代码的文件)代码来了解:
% cat x.groovy import groovy.transform.Field @Field List awe = [1, 2, 3] def awesum() { awe.sum() } assert awesum() == 6 % groovyc x.groovy % javap x Compiled from "x.groovy" public class x extends groovy.lang.Script { (1) java.util.List awe; (2) public static transient boolean __$stMC; public x(); public x(groovy.lang.Binding); public static void main(java.lang.String...); public java.lang.Object run(); (3) public java.lang.Object awesum(); (4) public void setAwe(java.util.List); protected groovy.lang.MetaClass $getStaticMetaClass(); public static java.lang.invoke.MethodHandles$Lookup $getLookup(); }
型((#)添加是我的)在JVM上加载和运行的“一切”都必须是一个类。Groovy将给定的文件编译为扩展Script的东西(1),这是文档中提到的 script。(2)是现在生成的 *private字段 *。(3)是 *run方法 *。最后(4)是生成的 *awesum方法 *。
(#)
Script
2条答案
按热度按时间tjrkku2a1#
在编译期间,groovy将脚本转换为扩展groovy.lang.Script的java类。
因此,所讨论的代码将近似转换为:
字符串
如果没有
@Field
注解,变量awe
将成为run()
方法的一部分,显然awesum()
函数将抛出错误:型
在
groovyconsole
中,您可以选择菜单Script -> Inspect AST
来查看为脚本生成的类的数据
kqhtkvqz2#
供参考的报价和代码中的问题是从Javadoc of @Field .完整的一部分:
变量注解,用于将脚本中变量的范围从脚本的run方法内更改为脚本的类级别。
带注解的变量将成为脚本类的私有字段。字段的类型将与变量的类型相同。示例用法:
字符串
在这个例子中,如果没有annotation,变量awe将是一个本地脚本变量(从技术上讲,它将是脚本类的run方法中的本地变量)。这样的本地变量在awesum方法中不可见。使用annotation,awe将成为脚本类中的私有List字段,并在awesum方法中可见。
需要它的原因以及“脚本”在这里的含义可以通过“反汇编”生成的“groovy脚本”(一个只包含示例代码的文件)代码来了解:
型
(
(#)
添加是我的)在JVM上加载和运行的“一切”都必须是一个类。Groovy将给定的文件编译为扩展
Script
的东西(1),这是文档中提到的 script。(2)是现在生成的 *private字段 *。(3)是 *run方法 *。最后(4)是生成的 *awesum方法 *。