2.MethodHandle

Java7為間接調(diào)用方法引入了新的API。其中的關(guān)鍵是java.lang.invoke包,即方法句柄。你可以把它看做反射的現(xiàn)代化方式,但它不像反射API那樣有時會顯得冗長、繁重和粗糙。方法句柄是將invokedynamic引入JVM項目中的一部分.
MethodHandle api要比反射快很多因為訪問檢查在創(chuàng)建的時候就已經(jīng)完成了,而不是像反射一樣等到運(yùn)行時候才檢查
句柄:句柄是一種特殊的智能指針,用來唯一標(biāo)識對象。

MethodHandle

JDK7為間接調(diào)用方法引入新的API,在java.lang.invoke包下,可以看作為反射的升級版,但它不像反射API那樣顯得冗長、繁重

主要的類

MethodHandle

方法句柄、對可直接執(zhí)行的方法的類型化引用,能夠安全調(diào)用方法的對象。
MethodHandle 是抽象類,無法直接實例化,需通過MethodHandles.Lookup的工廠方法來創(chuàng)建

MethodType

每個方法句柄都有一個MethodType實例,用來指明方法的返回類型和參數(shù)類型。

  • static MethodType methodType(Class<?> rtype, Class<?> ptype0, Class<?>... ptypes)
    第一次參數(shù)是返回類型,后面的剩余參數(shù)是方法的參數(shù)類型

MethodHandles

這個類只包含返回方法句柄操作的靜態(tài)方法。它們分為以下幾類:

  • 查找方法,幫助創(chuàng)建方法和字段的方法句柄。
  • 組合方法,將先前的方法合并或轉(zhuǎn)換成新的方法。
  • 其他工廠方法來創(chuàng)建方法來模擬其他常見的JVM操作或控制流模式

MethodHandles.Lookup

創(chuàng)建MethodHandle的工廠方法查找類

  • MethodHandle findVirtual(Class<?> refc, String name, MethodType type)查找方法名為name的方法
  • MethodHandle findStatic(Class<?> refc, String name, MethodType type)查找靜態(tài)方法
  • MethodHandle findSetter(Class<?> refc, String name, Class<?> type)查找setter方法,name是該屬性的名稱,不是方法名稱

使用示例

唯一決定方法:在類中:方法名+參數(shù)類型+返回值類型


MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodType mt = MethodType.methodType(String.class, char.class, char.class);
MethodHandle mh = lookup.findVirtual(String.class, "replace", mt);
String s = (String) mh.invokeExact("daddy",'d','n');

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容