問題與解決方案php
學習 GroovyGroovy 概述html
簡單的來說 DSL 是一個面向特定小領域的語言,如常見的 HTML、CSS 都是 DSL,它一般是以配置的方式進行編程,與之相對的是通用語言(General Purpose Language),如 Java 等。
環境安裝java
1 | $ curl -s http://get.sdkman.io | bash |
1 | $ source "$HOME/.sdkman/bin/sdkman-init.sh" |
1 | $ sdk install groovy |
1 2 |
$ groovy -version Groovy Version: 2.4.4 JVM: 1.8.0_25 Vendor: Oracle Corporation OS: Mac OS X |
初探android
1 | $ vim test.groovy |
1 | println "hello, world!" |
1 2 |
$ groovy test.groovy hello, world! |
語言基礎git
例子都已經傳到 github 的 demo 項目中。
第一次使用 demo 項目的時候,須要等待自動下載幾個遠程包。
筆者一個 Java 程序員,能夠你可以看到不少 Java 的習性仍是留在代碼中。
文件與類,變量與函數程序員
ScriptClass.groovy
1 | println 'hello,world' |
groovy/build/classes/main/io/kvh/as/groovy/ScriptClass.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class ScriptClass extends Script { public ScriptClass() { CallSite[] var1 = $getCallSiteArray(); } public ScriptClass(Binding context) { CallSite[] var2 = $getCallSiteArray(); super(context); } public static void main(String... args) { CallSite[] var1 = $getCallSiteArray(); var1[0].call(InvokerHelper.class, ScriptClass.class, args); } public Object run() {//關鍵方法 CallSite[] var1 = $getCallSiteArray(); return var1[1].callCurrent(this, "hello,world");// got it? } } |
VarAndMethod.groovy
1 2 3 4 5 6 7 8 9 10 |
def varAndMethod() { def a = 1//不顯式聲明變量類型 a = "abc"//運行時改變類型 println a//無需;結束一行代碼 a = 4//最後一行做爲返回值 } def ret = varAndMethod()//文件內運行方法 println ret//輸出4 |
字符串github
Quoted.groovy
1 2 3 4 5 6 7 8 9 10 |
def quoted() { def singleQ = 'hello, single quot'// 聲明爲java.lang.String def doubleQ = "hello, double quot ${singleQ}"// 若是有${},則爲groovy.lang.GString,支持變量替換;不然爲java.lang.String def tripleQ = '''hello, triple quot'''// 容許多行,而不須要+號 println singleQ println doubleQ println tripleQ } |
1 2 3 |
"""...""" /.../ $/.../$ |
List,Array 和 Map編程
Collections.groovy
1 2 3 4 5 6 7 |
def playList() { def lst = ["a",2,true]//支持不一樣類型元素 println(lst) } playList() |
1 2 3 4 5 6 7 8 9 |
def playArray() { def intArr = [1, 2, 3] as int[]//顯示聲明 String[] strArr = ["a", "b"]//另一種方式 println(intArr) println(strArr) } playArray() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
def playMap() { def map = [a: "a", b: "b"] println(map) def key = "name" def map2 = [key: 'a']//未使用 def map3 = [(key): 'a']//使用 println(map2) println(map3) } playMap() |
importvim
1 2 3 4 5 6 7 8 |
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 |
Import.groovy
1 2 3 |
import java.lang.String as KString println(new KString("aaa")) |
語言特性及其本質Closure(閉包)ruby
1 | { [closureParameters -> ] statements } |
Closure.groovy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
def defaultIt() { 3.times { println it //默認參數 it } } defaultIt() def closureObj() { def obj = { a -> ++a } println obj.call(1) } closureObj() |
面向對象特性
GroovyCLass.groovy
1 2 3 4 5 6 7 |
class People{ String name int age } People p1 = new People(); People p2 = new People(name:"Luis",age: 29)//經過相似 map 的方式賦值參數 |
1 2 3 4 5 6 |
def foo(String p1, int p2 = 1) { println(p1) println(p2) } foo("hello") |
1 2 3 4 |
class People{ String name int age } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
trait Fly { void fly() { println("fly") } } trait Walk { void walk() { println("walk") } } class Duck implements Fly, Walk { } Duck duck = new Duck() duck.fly() duck.walk() |
Groovy 基礎小結
學習 GradleGradle 安裝
1 | brew install gradle |
Wrapper 是爲了讓不一樣版本的插件可以使用其對應版本的 Gradle 的一個機制Gradle Wrapper 會把不一樣的版本 Gradle 安裝在:
1 | $USER_HOME/.gradle/wrapper/dists |
Gradle Build 的生命週期
1 2 3 4 5 6 7 8 |
. ├── app //app module │ ├── build.gradle //app module 的 build.gradle ├── build.gradle //項目 build.gradle,一般配置項目全局配置,如 repositories 和 dependencies ├── gradle.properties //項目屬性文件,一般能夠放置一些常量 ├── lib //lib module │ ├── build.gradle //lib module 的 build.gradle └── settings.gradle //項目整體設置,一般是配置項目中全部的 module |
Gradle 構建三個階段:
Settings.gradle
settings.gradle
1 2 3 |
include ':app', ':groovy' println 'print in settings.gradle' |
1 | ./gradlew -p groovy build |
Task
groovy/build.gradle
1 2 3 4 5 |
task hello { doLast { println 'Hello,' } } |
1 2 |
$ ./gradlew hello Hello, |
1 2 3 |
task World << { println 'World!' } |
1 2 3 |
task hi { println 'description hi' } |
1 | println 'hi' |
1 2 3 4 5 6 7 8 9 10 11 |
task hello { doLast { println 'Hello,' } } task intro(dependsOn: hello) << { println 'intro' } World.finalizedBy hello |
Plugin
1 | apply plugin: java |
1 | apply from: 'file_uri.gradle' |
Gradle 實踐參考
1 2 3 4 5 6 7 8 9 10 11 12 13 |
android.applicationVariants.all { variant ->//獲取 variant 參數,就是 productFlavor x buildType variant.outputs.each { output ->//獲取輸出文件 def file = output.outputFile//修改實例 output.outputFile = new File( (String) file.parent, (String) file.name.replace( file.name, // alter this string to change output file name "Your_Apk_Name_" + variant.name + "_" + variant.versionName + ".apk" ) ) } } |
總結