Groovy 方法擴充套件

2021-10-06 02:55:05 字數 3026 閱讀 7053

groovy允許對乙個類的進行新增額外的靜態方法或者例項方法。

步驟:編寫乙個靜態方法。

meta-inf/service/org.codehaus.groovy.runtime.extensionmodule檔案宣告擴充套件函式位置。

打成jar

demo:

我們首先實現對string例項方法進行擴充套件,判斷這個字元和另乙個字串是否包含字元*

擴充套件函式語法要求:

必須有至少乙個引數,且第乙個引數型別是擴充套件的類

函式必須為靜態

package org.fmy

class stringext

}

然後我們在為string新增乙個靜態擴充套件方法,判斷另乙個字串是否包含字元x

package org.fmy

class stringstaticext

}

接下來就是在meta-inf/service/org.codehaus.groovy.runtime.extensionmodule檔案宣告擴充套件函式位置。

modulename = mystringext //你的模組名

moduleversion = 1.0 //版本

extensionclasses = org.fmy.stringext //例項擴充套件函式

staticextensionclasses =org.fmy.stringstaticext //靜態擴充套件函式

最後達成jar放入另乙個工程中執行即可。

如下**:

println "asd*sad".containstar("asdsd*")

println string.containx("2x")

輸出:

true

self = null

true

use函式擴充套件

groovy中存在乙個特殊的函式use接受兩個引數,第乙個擴充套件類,第二個closure.

/**

* scoped use method

** @param self any object

* @param categoryclass a category class to use

* @param closure the closure to invoke with the category in place

* @return the value returned from the closure

* @since 1.0

*/public static t use(object self, class categoryclass, closureclosure)

擴充套件類語法糖或者說規則:

存在0到n個靜態函式,其中第乙個引數為擴充套件某個物件類,後續引數為開發擴充套件函式的傳入引數。

舉個例子:

假設存在乙個類person,我們需要對其擴充套件乙個函式cry,傳入乙個引數,然後列印。

class person 

def person = new person()

class personext

}use(personext)

輸出:

person invoke cry hello world
class person 

def person = new person()

class personext

}@category(person)

class personext2 personext2 invoke cry $msg")

}}use(personext2)

輸出:

person@587d1d39 personext2 invoke cry hello world
use存在多個擴充套件實現引數時,後者優先

//由於personext2在後面,所以只會呼叫personext2

use(personext, personext2)

mixin

mixin是乙個groovy註解,用於標註某個類注入到被標註的類上。

@mixin(student)

class person

class student

}def person = new person()

person.goschool()

當然需要注意的是mixin所傳入的類必須存在無參構造。

換個形式

class person 

class student

}person.mixin(student)

def person = new person()

person.goschool()

trait

mixin已經被啟用了,取而代之的是trait機制。trait是乙個關鍵字,標註某個類是乙個專門用於混合使用的。其他類想混合trait類方法時主需要實現介面。

class person implements student 

trait student

}def person = new person()

person.goschool()

需要注意trait類不能例項化,且存在無參構造

Groovy方法注入

分類注入 1class req use req class stringutil 載入順序右後到先 stringutil req 本身的方法 use req,stringutil println get 給類注入靜態方法 def str string.metaclass.static printcl...

java呼叫groovy方法

專案中自己寫的方法 第一句 獲取tomcat載入專案完成後的路徑,再拼接groovy的包路徑 create by hanweihu on 2018 06 13 pm param grofullname groovy的全名 包括副檔名 param params 引數,如果有多個,object para...

Groovy集合型別

groovy中有3種集合型別,分別是列表list 對映map 區間range 1 列表 list的初始化,直接在 中直接寫入初始的資料即可 def list1 1,2,3 list支援的運算子和方法 def list2 list1 2 1,2,3,1,2,3 list2.unique 1,2,3 l...