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