前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Groovy 笔记

Groovy 笔记

作者头像
tonglei0429
发布2019-07-24 11:56:57
1.2K0
发布2019-07-24 11:56:57
举报

Groovy 是基于 JVM 的 动态脚本语言,可以与 Java 无缝对接。Groovy 并不替代 Java,而是与 Java 互补

Hello world

下载地址: http://www.groovy-lang.org/download.html 并将 groovy/bin 配置到环境变量中

创建 hello.groovy

println 'Hello world'

执行

$ groovy hello.groovy
Hello world

基本语法

  • 数组 // in java int[] arr = {1, 2, 3}; // in groovy int[] arr = [1, 2, 3]
  • POJO // in java public class Person { private String name; Person(String name) { this.name = name } public String getName() { return name } public void setName(String name) { this.name = name } } // in groovy class Person { String name } def person = new Person(name: '张三')
  • 包权限 Groovy 默认是 public 访问权限。这点与 Java 不同
  • 变量 声明时可以省略类型定义,Groovy 会自动判断类型 def a = 123 // Integer def b = '123' // String def c = '$123' // GString
  • 数字类型 def a = 123i // Integer def b = 123l // Long def c = 123g // BigInteger def d = 12.3g // BigDecimal def e = 12.3d // Double def f = 12.3f // Float
  • 字符串 在Groovy种有两种字符串类型,普通字符串(java.lang.String)和插值字符串(groovy.lang.GString)。 // 普通字符串 def a = "world" // 或使用单引号 'world' // 插值字符串 def b = "Hello $a" // 必须双引号 // 三单引号保持缩进格式 def c = '''\ tab 0 tab 1 tab 2 ''' // 声明字符的三种方法 char c1 = 'A' def c2 = 'B' as char def c3 = (char) 'C'
  • 方法
    1. 返回类型可忽略
    2. return 可忽略,默认返回最后一行代码的结果
    3. 参数类型可以忽略

    // 以下两个方法等价 def method1(a) { 'hello ' + a } public String method2(int a) { return 'hello ' + a }

  • 闭包 闭包是一段可执行代码,可以像变量一样使用 //闭包的参数为可选项 def closure = { [closureParameters -> ] statements } // 闭包的声明 def abc = {param1, param2 -> println 'hello ' + param1 + ', ' + param2} // 闭包的调用方法 abc('world1', 'world2') abc.call('world1', 'world2') abc 'world1'
  • 列表 def numbers = [1, 2, 3] // java.util.ArrayList
  • 数组 当声明时指定了类型,便会定义成数组 String[] arrStr = ['Ananas', 'Banana', 'Kiwi'] // String[] def numArr = [1, 2, 3] as int[] // int[]
  • Map 通过 [key: value] 方式定义 Map,对应 Java 的 java.util.Map,默认类型是 java.util.LinkedHashMap。 // Map 的 key 声明时不需要写引号,Groovy 会自动添加 def colors = [red: '#FF0000', green: '#00FF00', blue: '#0000FF'] def key = 'key_name' def map = [key: 'some value1'] // 此时 key: 会被转换为 'key' def map = [(key): 'some value2'] // 此时key: 会使用 'key_name'
  • 区间 在 Groovy 中可以使用..操作符来定义一个区间对象。 def range1 = 0..5 // = def range = [0, 1, 2, 3, 4, 5] def range2 = 0..<5 // = def range = [0, 1, 2, 3, 4] def range3 = 'a'..'d' // 支持字符类型 ['a', 'b', 'c', 'd']
  • 与Java集成 Java 调用 Groovy
    • Eval groovy.util.Eval 类是最简单的用来在运行时动态执行 Groovy 代码的类,提供了几个静态工厂方法供使用,内部其实就是对GroovyShell的封装。

    public class GroovyTest { public static void main() { // 执行 Groovy groovy.util.Eval.me("println 'hello world'"); // 绑定自定义参数 Object result = Eval.me("age", 22, "if(age < 18){'未成年'}else{'成年'}"); // = 成年 // 绑定一个名为 x 的参数的简单计算 Eval.x(4, "2*x"); // = 8 //带有三个绑定参数(x、y 和 z)的简单计算 Eval.xyz(4, 5, 6, "x*y+z"); // = 26 } }

    • GroovyShell groovy.lang.GroovyShell 除了可以执行 Groovy 代码外,提供了更丰富的功能,比如可以绑定更多的变量,从文件系统、网络加载代码等。

    GroovyShell shell = new GroovyShell(); //可以绑定更多变量 shell.setVariable("age",22); //直接求值 shell.evaluate("if(age < 18){'未成年'}else{'成年'}"); //解析为脚本,延迟执行或者缓存起来 Script script = shell.parse("if(age < 18){'未成年'}else{'成年'}"); assertEquals(script.run(), "成年"); //可以从更多位置加载/执行脚本 //shell.evaluate(new File("script.groovy")); //shell.evaluate(new URI("http://wwww.a.com/script.groovy"));

    • GroovyClassLoader groovy.lang.GroovyClassLoader是一个定制的类加载器,可以在运行时加载 Groovy 代码,生成 Class 对象。

    GroovyClassLoader groovyClassLoader = new GroovyClassLoader(); String scriptText = "class Hello { void hello() { println 'hello' } }"; // 将Groovy脚本解析为Class对象 Class clazz = groovyClassLoader.parseClass(scriptText); // Class clazz = groovyClassLoader.parseClass(new File("script.groovy")); assertEquals(clazz.getName(),"Hello"); clazz.getMethod("hello").invoke(clazz.newInstance());

    • GroovyScriptEngine groovy.util.GroovyScriptEngine能够处理任何 Groovy 代码的动态编译与加载,可以从统一的位置加载脚本,并且能够监听脚本的变化,当脚本发生变化时会重新加载。

    //script/groovy/hello.groovy println "hello $name" GroovyScriptEngine scriptEngine = new GroovyScriptEngine("script/groovy"); Binding binding = new Binding(); binding.setVariable("name", "groovy"); while (true){ scriptEngine.run("hello.groovy", binding); TimeUnit.SECONDS.sleep(1); } //输出 hello groovy hello groovy .... //将hello.groovy内代码修改为println "hi $name", GroovyScriptEngine会重新进行加载 hi groovy hi groovy

    • JSR 223 javax.script API JSR-223 是 Java 中调用脚本语言的标准 API。从 Java 6 开始引入进来,主要目的是用来提供一种统一的框架,以便在 Java 中调用多种脚本语言。JSR-223 支持大部分流行的脚本语言,比如JavaScript、Scala、JRuby、Jython和Groovy等。

    ScriptEngine engine = new ScriptEngineManager().getEngineByName("groovy"); Bindings bindings = new SimpleBindings(); bindings.put("age", 22); Object value = engine.eval("if(age < 18){'未成年'}else{'成年'}",bindings); assertEquals(value,"成年"); //script/groovy/hello.groovy //println "hello world" engine.eval(new FileReader("script/groovy/hello.groovy")); //hello world

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Hello world
  • 基本语法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档