Groovy 程序结构
本篇是程序结构的阅读笔记。
1.包名
包名和Java相同
2.Import
2.1.默认导入
Groovy默认导入了
import java.lang.*
import java.util.*
import java.io.*
import java.net.*
import groovy.lang.*
import groovy.util.*
import java.math.BigInteger
import java.math.BigDecimal
2.2.简单导入
全限定名导入类
2.3.星号导入
import groovy.xml.*
def markupBuilder = new MarkupBuilder()
assert markupBuilder != null
assert new StreamingMarkupBuilder() != null
2.4.静态导入
Groovy允许静态导入类并且与导入方法同名的方法,只要类型不同:
import static java.lang.String.format
class SomeClass {
String format(Integer i) {
i.toString()
}
static void main(String[] args) {
assert format('String') == 'String'
assert new SomeClass().format(Integer.valueOf(1)) == '1'
}
}
如果具有相同的类型,以导入的类优先。
2.5.静态导入别名
import static Calendar.getInstance as now
assert now().class == Calendar.getInstance().class
2.6.静态星号导入
import static java.lang.Math.*
assert sin(0) == 0.0
assert cos(0) == 1.0
2.7.导入别名
import java.util.Date
import java.sql.Date as SQLDate
Date utilDate = new Date(1000L)
SQLDate sqlDate = new SQLDate(1000L)
assert utilDate instanceof java.util.Date
assert sqlDate instanceof java.sql.Date
3.脚本与类
3.1. public static void main 和 脚本
Groovy的类形式:
class Main {
static void main(String... args) {
println 'Groovy world!'
}
}
Groovy的脚本形式:
println 'Groovy world!'
脚本无需定义一个类来执行
3.2.脚本类
import org.codehaus.groovy.runtime.InvokerHelper
class Main extends Script {
def run() {
println 'Groovy world!'
}
static void main(String[] args) {
InvokerHelper.runScript(Main, args)
}
}
3.3.方法
脚本中可以定义方法。
3.4.变量
脚本中得变量不需要定义类型,因此:
int x = 1
int y = 2
assert x+y == 3
和
x = 1
y = 2
assert x+y == 3
是一样的。
但是两者直接还是存在一定得差异
在第一种写法中,参数将被定义为局部变量,并且在run方法之外不可访问。
public Object run() { CallSite[] var1 = $getCallSiteArray(); int x = 1; int y = 2; return BytecodeInterface8.isOrigInt() && !__$stMC && !BytecodeInterface8.disabledStandardMetaClass() ? var1[3].callCurrent(this, x + y) : var1[1].callCurrent(this, var1[2].call(Integer.valueOf(x), Integer.valueOf(y))); }
以上是第一种写法的脚本中的
run
方法,可以看到x
和y
被定义成了方法中的变量。在第二种写法中,参数被定义成脚本的属性,在脚本类中都可以访问到。
public Object run() { CallSite[] var1 = $getCallSiteArray(); byte var2 = 1; ScriptBytecodeAdapter.setGroovyObjectProperty(Integer.valueOf(var2), Five.class, this, (String)"x"); byte var3 = 2; ScriptBytecodeAdapter.setGroovyObjectProperty(Integer.valueOf(var3), Five.class, this, (String)"y"); return var1[1].callCurrent(this, var1[2].call(var1[3].callGroovyObjectGetProperty(this), var1[4].callGroovyObjectGetProperty(this))); }