日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )

發(fā)布時(shí)間:2025/6/17 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 ) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 總結(jié)
  • 一、靜態(tài)閉包變量
    • 1、執(zhí)行普通閉包變量
    • 2、執(zhí)行靜態(tài)閉包變量
  • 二、 在閉包中定義閉包
  • 三、 完整代碼示例

總結(jié)


在閉包中 , 打印 this , owner , delegate , 打印結(jié)果都是創(chuàng)建閉包時(shí)所在的類 ;

  • 如果在類中創(chuàng)建閉包 , 則打印結(jié)果是類 ;
  • 如果在實(shí)例對(duì)象中創(chuàng)建閉包 , 則打印結(jié)果是實(shí)例對(duì)象 ;
  • 如果在閉包 A 中創(chuàng)建 閉包 B , this 是最外層閉包 A 之外的類 , owner , delegate 是上一層閉包 B ;




一、靜態(tài)閉包變量




1、執(zhí)行普通閉包變量


在類中定義閉包變量 , 在閉包中打印 this、owner、delegate 值 ,

class Test2 {def closure = {println "this : " + thisprintln "owner : " + ownerprintln "delegate : " + delegate} }

執(zhí)行上述 Test2 類中的閉包 ,

new Test2().closure()

打印結(jié)果如下 : 打印的值都是 Test2 實(shí)例對(duì)象 ;

this : Test2@5082d622 owner : Test2@5082d622 delegate : Test2@5082d622

2、執(zhí)行靜態(tài)閉包變量


如果將閉包聲明為靜態(tài)變量 ,

class Test2 {def static closure = {println "this : " + thisprintln "owner : " + ownerprintln "delegate : " + delegate} }

直接使用閉包所在類直接調(diào)用閉包 , 不再使用閉包所在類對(duì)象調(diào)用閉包 ;

Test2.closure()

執(zhí)行結(jié)果為 : 打印的值都是 Test2 類 ;

this : class Test2 owner : class Test2 delegate : class Test2

還是上述靜態(tài)閉包變量 , 使用 Test2 實(shí)例對(duì)象調(diào)用 ,

new Test2().closure()

打印的結(jié)果是創(chuàng)建閉包時(shí)所在的類 ;

this : class Test2 owner : class Test2 delegate : class Test2



二、 在閉包中定義閉包



在 Test2 類中定義 閉包變量 closure2 , 在 closure2 閉包中定義 closure3 閉包 ,

class Test2 {def closure2 = {def closure3 = {println "this : " + thisprintln "owner : " + ownerprintln "delegate : " + delegate}closure3()} }

打印結(jié)果如下 :

this : Test2@291a7e3c owner : Test2$_closure1@4ae9cfc1 delegate : Test2$_closure1@4ae9cfc1

this 值為 外部的 Test2 實(shí)例對(duì)象 ;

owner 和 delegate 是 Test2 中定義的 closure2 閉包 ;


創(chuàng)建 closure2 閉包時(shí) , this、owner、delegate 都是 Test2 實(shí)例對(duì)象 ;

但是創(chuàng)建 closure3 閉包時(shí) , this 的值還是設(shè)置 closure2 的 this 值 , owner、delegate 值設(shè)置成 closure2 閉包 ;

// 創(chuàng)建內(nèi)層閉包時(shí) , 傳入的 this 是 外層閉包的 this.getThisObject() // 因此 this 值仍是 Test2 實(shí)例對(duì)象 // owner、delegate 變?yōu)橥鈱拥?Closure 閉包 ; Object closure3 = new _closure2(this, this.getThisObject());

分析生成的字節(jié)碼文件 :

// // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) //import groovy.lang.Closure; import groovy.lang.GroovyObject; import groovy.lang.MetaClass; import groovy.transform.Generated; import groovy.transform.Internal; import org.codehaus.groovy.runtime.GeneratedClosure; import org.codehaus.groovy.runtime.callsite.CallSite;public class Test2 implements GroovyObject {private Object closure2;@Generatedpublic Test2() {CallSite[] var1 = $getCallSiteArray();super();// 創(chuàng)建外層閉包 Test2._closure1 var2 = new Test2._closure1(this, this);this.closure2 = var2;MetaClass var3 = this.$getStaticMetaClass();this.metaClass = var3;}@Generated@Internalpublic MetaClass getMetaClass() {MetaClass var10000 = this.metaClass;if (var10000 != null) {return var10000;} else {this.metaClass = this.$getStaticMetaClass();return this.metaClass;}}@Generated@Internalpublic void setMetaClass(MetaClass var1) {this.metaClass = var1;}@Generatedpublic Object getClosure2() {return this.closure2;}@Generatedpublic void setClosure2(Object var1) {this.closure2 = var1;}// 這是外層的 Closure 閉包public final class _closure1 extends Closure implements GeneratedClosure {public _closure1(Object _outerInstance, Object _thisObject) {CallSite[] var3 = $getCallSiteArray();super(_outerInstance, _thisObject);}public Object doCall(Object it) {CallSite[] var2 = $getCallSiteArray();// 這是內(nèi)層的 Closure 閉包final class _closure2 extends Closure implements GeneratedClosure {public _closure2(Object _outerInstance, Object _thisObject) {CallSite[] var3 = $getCallSiteArray();super(_outerInstance, _thisObject);}public Object doCall(Object it) {CallSite[] var2 = $getCallSiteArray();var2[0].callCurrent(this, var2[1].call("this : ", this.getThisObject()));var2[2].callCurrent(this, var2[3].call("owner : ", var2[4].callGroovyObjectGetProperty(this)));return var2[5].callCurrent(this, var2[6].call("delegate : ", var2[7].callGroovyObjectGetProperty(this)));}@Generatedpublic Object doCall() {CallSite[] var1 = $getCallSiteArray();return this.doCall((Object)null);}}// 創(chuàng)建內(nèi)層閉包時(shí) , 傳入的 this 是 外層閉包的 this.getThisObject() // 因此 this 值仍是 Test2 實(shí)例對(duì)象 // owner、delegate 變?yōu)橥鈱拥?Closure 閉包 ; Object closure3 = new _closure2(this, this.getThisObject());return var2[0].call(closure3);}@Generatedpublic Object doCall() {CallSite[] var1 = $getCallSiteArray();return this.doCall((Object)null);}} }



三、 完整代碼示例



完整代碼示例 :

class Test2 {// 定義靜態(tài)閉包// 即可以通過(guò)類執(zhí)行// 又可以通過(guò)對(duì)象執(zhí)行def static closure = {println "this : " + thisprintln "owner : " + ownerprintln "delegate : " + delegate}// 閉包中定義閉包def closure2 = {def closure3 = {println "this : " + thisprintln "owner : " + ownerprintln "delegate : " + delegate}closure3()} }println "通過(guò)類執(zhí)行閉包 :"Test2.closure()println "\n通過(guò)對(duì)象執(zhí)行閉包 :"new Test2().closure()println "\n閉包中定義閉包并執(zhí)行 : "new Test2().closure2()

執(zhí)行結(jié)果 :

通過(guò)類執(zhí)行閉包 : this : class Test2 owner : class Test2 delegate : class Test2通過(guò)對(duì)象執(zhí)行閉包 : this : class Test2 owner : class Test2 delegate : class Test2閉包中定義閉包并執(zhí)行 : this : Test2@1f010bf0 owner : Test2$_closure1@40db2a24 delegate : Test2$_closure1@40db2a24

總結(jié)

以上是生活随笔為你收集整理的【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美成人一区二区视频 | 超碰超碰97| 美女精品在线 | 国产精品电影一区二区三区 | 亚洲精品视屏 | 久草精品在线观看 | 国产精品伦一区二区三级视频 | 国产伦精品一区二区三区妓女下载 | 日韩福利视频导航 | aaaaa毛片| 欧美视频一 | 日韩第一页在线观看 | 亚洲AV无码成人精品国产一区 | 午夜网| 久久高清精品 | 欧美一区网站 | 日韩在线视频免费 | 99re热在线视频 | 色偷av| a人片 | 欧洲精品久久 | 精品国产午夜 | 亚洲爽爆 | 久久久久亚洲av片无码v | 精彩视频一区二区 | 日本xx视频免费观看 | 日韩a∨| 男人天堂网在线 | 免费古装一级淫片潘金莲 | 亚洲精品视频在线播放 | 成人午夜黄色 | 女生被草 | 91亚洲免费 | 黄色福利网站 | 国产又黄又爽又色 | 国产精品高潮呻吟久久久 | 日韩久久久精品 | 免费av网站在线观看 | 欧美性69| 69福利网| 精品少妇一区二区三区免费观看 | 亚洲精品乱码久久久久久蜜桃91 | 欧美激情亚洲 | 亚洲免费精品视频 | 久热国产精品 | 魔性诱惑 | 毛片在哪里看 | 欧美色图亚洲色 | 中文字幕在线播放 | 国产精品自拍在线观看 | 国产又猛又粗 | 欧美做爰爽爽爽爽爽爽 | 国产精品91视频 | 国产白丝袜美女久久久久 | 最新av不卡| 成人在线免费观看网站 | 红桃视频一区 | 成人永久免费视频 | 国产精品天干天干 | 国产毛片毛片毛片毛片 | 国产69久久 | 操亚洲| 日本四级电影 | 大地资源中文在线观看免费版 | 午夜色婷婷 | 欧美1234区| 国产福利合集 | 欧美在线一级片 | 91禁蘑菇在线看 | 亚洲小说区图片区 | 日本大胆人体视频 | 国产日韩久久久 | 插我舔内射18免费视频 | 亚洲不卡av一区二区 | 99自拍视频在线观看 | 在线播放波多野结衣 | 7x7x7x人成影视 | 国产乱码精品一区二区三 | 色网在线| 免费黄片毛片 | 久草超碰在线 | av私库在线观看 | 末路1997全集免费观看完整版 | 国产麻豆精品在线 | 国产精品无码一区二区桃花视频 | 波多野吉衣一区二区三区 | 在线高清av| 日本黄色aaa| 在线观看黄色av | 欧美性爱精品在线 | 特黄一级大片 | 亚洲日本欧美精品 | 亚洲国产精品成人久久蜜臀 | 亚洲熟女乱综合一区二区 | 亚洲伦乱 | 日本va视频 | 免费看特级毛片 | 成年人性生活免费视频 | 成人在线综合 |