閱讀此文章的作者建議先了解java反射和動態代理。
java7中為間接調用方法引入了新的api,其中最關鍵的是java.lang.invoke包,即方法句柄。我們可以看成是java反射的升級版,但是它不反射那樣有時候顯得冗長、繁重的粗糙。
方法句柄中首先涉及到兩個重要的類,MethodHandle和MethodType。
MethodHandle
它是可對直接執行的方法(或域、構造方法等)的類型的引用,或者說,它是一個有能力安全調用方法的對象。換個方法來說,通過句柄我們可以直接調用該句柄所引用的底層方法。從作用上來看,方法句柄類似於反射中的Method類,但是方法句柄的功能更加強大、使用更加靈活、性能也更好。
MethodType
它是表示方法簽名類型的不可變對象。每個方法句柄都有一個MethodType實例,用來指明方法的返回類型和參數類型。它的類型完全由參數類型和方法類型來確定,而與它所引用的底層的方法的名稱和所在的類沒有關系。舉個例子,例如String類的length方法和Integer類的intValue方法的方法句柄的類型就是一樣的,因為這兩個方法都沒有參數,而且返回值類型都是int,則我們可以通過下列語句獲取同一個方法類型:MethodType mt = MethodType.methodType(int.class);
MethodType的對象實例只能通過MethodType類中的靜態工廠方法來創建,而且MethodType類的所有對象實例都是不可變的,類似於String類。如果修改了MethodType實例中的信息,就會生成另外一個MethodType實例。
參考資料:《java程序員修煉之道》、《深入理解java7核心技術與最佳實踐》