Groovy入門
初識Groovy
- 1.基本語法
groovy作為動態的腳本語言,底層實現為java,groovy文件在運行時,先被解釋成.class文件,本身為腳本語言,所以他的優勢在于動態加載;
(1)定義變量及方法
//.groovy
def str = new String()
def str1 = 'abc'
def str2 = "$str1 : 556"
def getSome(var12) {
println var12
}
在這里groovy不重視類型,但是也可以像java一樣,重視類型,基本操作與java相同;值得注意的是,在groovy中單引號和雙引號是有不同功能的,只是定義一個字符串,可以直接用單引號,在雙引號中可以格式化字符串,就像例子中的$str,會被解釋成abc
(2)強大的閉包
//讀取文件,按行輸出
new File('filePath').eachline('encoding') {
//closure
line -> println line
}
//定義閉包函數
def foo = {
key, value ->
..dosomething
println "$key : $value"
}
//調用
foo.call('name', 'Mr.zou')
def list = [1,2,3,4,5]
list.each {
println it
}
閉包其實類似于java中的lambda函數,在最后一個例子中,使用一個變量為it,這個是groovy的內置變量,在這里表示循環的item,可以看到在調用調用each的時候,方法沒有小括號,這是個有趣的地方,因為groovy允許如果函數的最后一個參數是一個閉包的話,那么小括號可以省略
(3)文件操作
上面的例子已經提到文件的讀方法,要比java簡單的多,下面看一下寫的例子
//補充讀文件的方法
def file = new File('filepath')
println file.text //直接輸出文件文本
//寫文件
def file = new File("E:/test.txt")
file.withWriter { writer ->
writer << 'xixi \r\n'
writer << 'haha \r\n'
}
file對象提供了豐富的流對象,操作文件更方便
(4)json
groovy提供可很強大的針對json的操作功能,核心的類JsonSlurper,JsonOutput
def jsonStr = "{\"state\":{\"name\":\"zouYu\",\"age\":12}}"
def parser = new JsonSlurper().setType(JsonParserType.LAX)
def jsonResp = parser.parseText(jsonStr) as HashMap
def info = jsonResp.state as HashMap
def user = new Expando(info)
user.setProperty('abc', false)
println(user)
println JsonOutput.toJson(user)
上面的結果是
{name=zouYu, age=12, abc=false}
{“name”:”zouYu”,”age”:12,”abc”:false}
其中Expando稍后再講,先說一下JsonSlurper類,可以看到在初始化對象之后調用了setType方法,這個參數的作用是,允許json字符串存在注釋或者沒有引號的字段,這個是一個非常好的功能,推薦使用這種模式,還有一點就是在定義info時,后面使用了as,這意味著json字符串轉換成類型時,可以定義它的類型
相當于,如果我已經確定這個json字符串對應的實體對象,那么我可以直接使用
def student = parser.parseText(jsonStr) as Student
這樣就可以直接實例化一個student對象;JsonOutput提供了多種類型轉換成json字符串的方法
這里生成的json字符串可以更直觀的看出類的關系,但是這里需要注意的是,中文會被轉換成unicode編碼,在java中Unicode編碼字符串toString()之后會自動轉換成中文,但是這里不行
(5)面向對象
在做groovy開發時,可以查看groovy解釋生成的.class文件
我在同一個文件中定義了三個class,解釋之后會生成3個class文件,首先我們開一下簡單類
class Student {
String name
int age
School school
}
>>生成的class文件
import groovy.lang.GroovyObject;
import groovy.lang.MetaClass;
import org.codehaus.groovy.runtime.ScriptBytecodeAdapter;
import org.codehaus.groovy.runtime.callsite.CallSite;
import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
import org.codehaus.groovy.runtime.typehandling.ShortTypeHandling;
public class Student implements GroovyObject {
private String name;
private int age;
private School school;
public Student() {
CallSite[] var1 = $getCallSiteArray();
MetaClass var2 = this.$getStaticMetaClass();
this.metaClass = var2;
}
public Student(Object name, Object age, Object school) {
CallSite[] var4 = $getCallSiteArray();
MetaClass var5 = this.$getStaticMetaClass();
this.metaClass = var5;
this.name = (String)ShortTypeHandling.castToString(name);
this.age = DefaultTypeTransformation.intUnbox(age);
this.school = (School)ScriptBytecodeAdapter.castToType(school, School.class);
}
public String getName() {
return this.name;
}
public void setName(String var1) {
this.name = var1;
}
public int getAge() {
return this.age;
}
public void setAge(int var1) {
this.age = var1;
}
public School getSchool() {
return this.school;
}
public void setSchool(School var1) {
this.school = var1;
}
}
很明顯,groovy把封裝做的很好,屬性私有,對外暴露setter/getter方法,還有,groovy對方法也進行了處理,方法的默認返回值為方法的最后一行代碼,一切的工作都是在努力的減少工作量;
在面向對象中特別值得一提的就是元對象編程,什么意思呢?假如你現在想對一個沒有任何屬性的類,添加屬性并賦值,怎么辦,直接操作肯定是報錯的,groovy在這里提供了一個方法
class Student {
static void main(String[] args){
Student.metaClass.name = { -> 'Mr.zou'}
def stu = new Student()
println stu.name
}
}
對于這種模式,相當于在Student類上永久加了這個name屬性,之后初始化都會帶有這個屬性,還有要介紹的兩個類,Expando,ExpandoMetaClass,后者類似于上面的操作,主要說一下Expando,這個東西很好用,比如說我有這樣一個場景,我從接口中收到一個json串,我想不通過反序列化,直接將json轉換成對象并且對這個對象的屬性進行增改組裝,然后調用其他接口,代碼如下
def parser = new JsonSlurper().setType(JsonParserType.LAX)
def jsonResp = parser.parseText(var12) as HashMap //var12為jsonString
def student = new Expando(jsonResp as HashMap)
student.setProperty(propName, propValue);
student.getproperty(propName)
這個是Expando類提供的api和構造函數
在groovy中實現一個GroovyInterceptable類也是可以進行動態賦值的,invokeMethod相當于java反射
public Object invokeMethod(String name, Object args) {
return this.getMetaClass().invokeMethod(this, name, args);
}
這是源碼,GroovyObjectSupport抽象類繼承自GroovyObject
正在學習,寫的不好歡迎糾正,未完待續……..
智能推薦
Gradle開發環境的搭建和Groovy入門
gradle腳本是使用Groovy語言開發的,俗話說語言就是工具,想要寫gradle腳本那我們就需要先學學這門語言。 一、什么是DSL? 1、概念 DSL:領域特定語言,domain specific language的簡寫。groovy語言就是DSL的分支之一。 2、 常見的DSL類型語言 matlab:只用來做計算 uml:用來做建模 html:做瀏覽器可識別的網頁 等等… 本節...
基于java jdk的Groovy環境配置及基礎入門
一、 前言 Groovy是一門依賴JVM的動態解釋性語言,是Java語言的補充與升級。gradle工具就是用groovy語言編寫。工作中看到同事做中小型應用系統的時候,用過groovy語言,開發效率確實要比用純java編寫快很多。 二、 JDK安裝 Groovy依賴JVM,所以第一步先安裝java開發環境。(win7 64位) 注意:學Groovy前對java基礎知識要有一些了解或者對其他一些動態...
groovy筆記
文章目錄 安裝 基本語法 邏輯控制 閉包 基礎講解 閉包的使用 閉包的進階 閉包的委托策略 數據結構 面向對象 類與接口 元編程 文件操作 JSON XML JSON & XML互相轉換 普通文件操作 groovy與java的區別 安裝 Step1:配置JDK Groovy是依賴于Java的,所以首先要配置好JDK。 Step2:下載Groovy 下載后直接解壓安裝。 Step3:配置Gr...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
猜你喜歡
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...