Gradle閉包委託總結

2021-08-15 12:23:23 字數 1927 閱讀 5619

作為乙個還處於入門gradle的小白,記錄一下對gradle閉包委託的理解。

比如在 《android gradle權威指南》 可以看到類似如下**段:

static def person(closureclosure) 

class

person ,age is $"

}}task hello

}

首先person方法中傳進了一閉包closure,closure是groovy.lang下的乙個抽象類,我們指定了范型person,這裡為什麼要指定person呢?

closure.class

public v call(object

arguments) );

}

可以呼叫closure的call方法來執行閉包,返回值型別即為指定范型。不過,在as中寫gradle**發現並沒有型別強轉的問題(不同型別可以直接賦值),即使不指定范型也不影響執行。不過hello中配置person時會提示access to 'name' exceeds its access rights

接著看指定**的**:

person p = new person()

closure.delegate = p

closure.setresolvestrategy(closure.delegate_first)

我們建立了乙個person物件,將closure的**設定為新建立的person物件,同時指定處理策略為**模式模式優先。

closure中有三個成員屬性:優先順序thisobject>owner>delegate

private object delegate;

private object owner;

private object thisobject;

我們列印一下預設屬性:

static def person(closureclosure)
執行./gradlew hello

closure.thisobject=root project 'study'

//上下文

closure.owner=build_3v90txkmyoa0gezpesdi59gev$_run_closure3

@294e7e2d

closure.delegate=build_3v90txkmyoa0gezpesdi59gev$_run_closure3

@294e7e2d

closure.resolvestrategy=0

// owner_first

那我們不設定處理策略可不可以呢?當然是可以的,不設定會優先順序順序處理,比如owner沒有相應方法則會交給delegate處理。

接下來呼叫了closure(p),一開始我很不理解,既然已經設定了**物件,那這段**是在幹嘛?其實想複雜了,這就是在呼叫閉包執行。我們還可以用closure()、closure(null)、closure([1,2,3,4])等呼叫,也就是可以不傳引數或傳任意引數。也可以用closure的call方法呼叫執行,比如closure.call(p)

因為我們用的**模式,我們傳進的引數相當於閉包中的it引數,配置的時候我們並沒有用到。

所以,這裡如果不用**而用傳參的方式也可以實現類似效果。**改動如下:

person p = new person()

closure(p)

}class person ,age is $"

}}task hello

}

Gradle基礎知識 Groovy的閉包

上面 定義乙個名為 closure name 的閉包,用途由 closure body 中的 定義。匿名閉包指不宣告閉包變數名,只有閉包方法體 def closure with no param 執行closure with no param 或者closure with no param.call...

閉包的總結

先介紹一下全域性變數和區域性變數的優缺點 全域性變數 可以重用 但是會造成全域性汙染而且容易被篡改 區域性變數 僅函式內使用不會造成全域性汙染也不會被篡改 不可以重用 從上面可以看出全域性變數和區域性變數的優缺點剛好是相對的。閉包的出現正好結合了全域性變數和區域性變數的優點。何時使用閉包 希望重用乙...

Gradle自動化構建 三 Groovy 閉包

閉包與字串 string str 2 3 5,abc println str.each println str.find def list str.findall println list.toliststring 2,3,5 println str.any true any 只要符合條件就返回tr...