Groovy中的脚本类是什么?

w7t8yxp5  于 6个月前  发布在  其他
关注(0)|答案(2)|浏览(53)

我正在学习groovy,无法理解下面这段代码的语句。
搜索其他相关文档,但没有运气。有人可以帮助这里吗?谢谢。
第一个月
代码片段:

import groovy.transform.Field
@Field List awe = [1, 2, 3]
def awesum() { awe.sum() }
assert awesum() == 6

字符串

tjrkku2a

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()函数将抛出错误:

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来查看为脚本生成的类


的数据

kqhtkvqz

kqhtkvqz2#

供参考的报价和代码中的问题是从Javadoc of @Field .完整的一部分:
变量注解,用于将脚本中变量的范围从脚本的run方法内更改为脚本的类级别。
带注解的变量将成为脚本类的私有字段。字段的类型将与变量的类型相同。示例用法:

import groovy.transform.Field
@Field List awe = [1, 2, 3]
def awesum() { awe.sum() }
assert awesum() == 6

字符串
在这个例子中,如果没有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方法 *。

相关问题