在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

MethodHandle調用示例

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-13 14:17 ? 次閱讀

反射(Reflect)作為Java最重要的一種機制,相信大家一定都很熟悉了,今天要介紹另一種和反射機制類似的方法調用機制——MethodHandle。

MethodHandle是Java7引入的一種機制,主要是為了JVM支持動態語言。

一個MethodHandle調用示例

首先,讓指北君給大家演示一下最基本的MethodHandle使用。

第一步:創建查找對象:Lookup

// 獲取Look用于查找方法句柄
  MethodHandles.Lookup lookup = MethodHandles.lookup();

第二步:創建方法類型:MethodType

構造方法的返回值類型,參數類型

// 方法類型,描述返回值和參數,第一個參數為返回值類型,void則為void.class。第二個參數開始為被調用方法的參數類型
  MethodType mt = MethodType.methodType(boolean.class, String.class, int.class);

第三步:查找方法句柄

Lookup的findVirtual查找成員方法

//查找方法句柄,參數1:調用類,參數2:方法名,參數3:方法類型
  MethodHandle handle = lookup.findVirtual(String.class, "startsWith", mt);

第四步:方法調用

通過MehodHandle的invoke方法執行,并返回結果

//方法調用,參數1:實例,參數2..n:方法參數
  Boolean value = (Boolean)handle.invoke("the i am in the room", "the", 0);

以上就是一個簡單的調用示例。

核心代碼解讀

上面我們展示了一個最進本MethodHandle方式的方法調用,下面我們將對其中用到的主要類進行介紹。這些主要的類包含MethodType,MethodHandle,MethodHandles及Lookup。

MethodType

首先,我們來看看Methodtype,MethodType是用來封裝方法輸入輸出類型的,包含方法的返回和方法的參數。MethodType構造方法為私有,只能通過MethodType提供的靜態工具方法來獲取實例

/**
     * Constructor that performs no copying or validation.
     * Should only be called from the factory method makeImpl
     */
    private MethodType(Class< ? > rtype, Class< ? >[] ptypes) {
        this.rtype = rtype;
        this.ptypes = ptypes;
    }

MethodType中常用的工具方法有:

  • 大于一個參數
public static MethodType methodType(Class< ? > rtype, Class< ? > ptype0, Class< ? >... ptypes) {
        Class< ? >[] ptypes1 = new Class< ? >[1+ptypes.length];
        ptypes1[0] = ptype0;
        System.arraycopy(ptypes, 0, ptypes1, 1, ptypes.length);
        return makeImpl(rtype, ptypes1, true);
    }
  • 無參數
public static MethodType methodType(Class< ? > rtype) {
        return makeImpl(rtype, NO_PTYPES, true);
    }

工具方法都通過makeImple方法來封裝MethodType實例,指北君帶領大家來看看makeImple中做了哪些事情:

  1. 參數檢查
    • 返回值的類型不能為null,如果無返回使用void.class
    • 參數類型不能為null,且不能為void.class
  2. 使用緩存表緩存MethodType實例,優化處理
  3. 如果非信任模式(trusted==false),則克隆參數數組

這里需要注意MethodType重寫了hashCode方法,從邏輯看參數數組克隆不影響同類型的緩存機制。

static
    MethodType makeImpl(Class< ? > rtype, Class< ? >[] ptypes, boolean trusted) {
        if (ptypes.length == 0) {
            ptypes = NO_PTYPES; trusted = true;
        }
        MethodType primordialMT = new MethodType(rtype, ptypes);
        MethodType mt = internTable.get(primordialMT);
        if (mt != null)
            return mt;

        // promote the object to the Real Thing, and reprobe
        MethodType.checkRtype(rtype);
        if (trusted) {
            MethodType.checkPtypes(ptypes);
            mt = primordialMT;
        } else {
            // Make defensive copy then validate
            ptypes = Arrays.copyOf(ptypes, ptypes.length);
            MethodType.checkPtypes(ptypes);
            mt = new MethodType(rtype, ptypes);
        }
        mt.form = MethodTypeForm.findForm(mt);
        return internTable.add(mt);
    }

除了靜態工具方法外,MethodType還有幾個實例方法,主要為差異性較小的MethodType提供快速獲取實例的方法。包含:

  • changeParameterType
  • insertParameterTypes
  • appendParameterTypes
  • dropParameterTypes

MethodHandle

MethodHandle為抽象類,但是里面提供了大量的原生方法,提供底層訪問,也是方法調用的核心邏輯。這部分涉及MethodHandle的機制實現,對于使用功能來說指北君就不在此展開了。

@HotSpotIntrinsicCandidate
    public final native @PolymorphicSignature Object invokeExact(Object... args) throws Throwable;

    @HotSpotIntrinsicCandidate
    public final native @PolymorphicSignature Object invoke(Object... args) throws Throwable;

圖片
調用方法

MethodHandles, Lookup

MethodHandles不是MethodHandle的實現,他提供工具用于幫助獲取MethodHandle,我們主要使用到lookup(),publicLookup()

@CallerSensitive注解,可以使Reflection.getCallerClass()獲取到調用lookup()方法的類

@CallerSensitive
    @ForceInline // to ensure Reflection.getCallerClass optimization
    public static Lookup lookup() {
        return new Lookup(Reflection.getCallerClass());
    }
public static Lookup publicLookup() {
        return Lookup.PUBLIC_LOOKUP;
    }

Lookup構造方法主要傳入兩個參數:

  1. lookupClass搜尋的類,
  2. allowedModes:許可模式。

最后,通過Lookup的findXXX獲取到MethodHandle,詳細說明見下表:

圖片
查找方法

小結

關于MethodHandle的基本使用就基本講完,這里附上一張類圖便大家理解:圖片

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 參數
    +關注

    關注

    11

    文章

    1867

    瀏覽量

    32894
  • 代碼
    +關注

    關注

    30

    文章

    4891

    瀏覽量

    70331
  • Method
    +關注

    關注

    0

    文章

    9

    瀏覽量

    7394
  • JVM
    JVM
    +關注

    關注

    0

    文章

    160

    瀏覽量

    12539
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    gpio示例調用流程

    NuttX版本:V10.1.0MCU:STM32F411CEU6GPIO:PB8 --- LED前提知識: NuttX V10.1.0 : gpio示例調用流程_
    發表于 02-17 07:39

    求助,請問有沒有UM2262調用加密庫的具體示例

    我的項目使用移植到我的 STM32L496 板的 SBSFU 模板。我需要從用戶應用程序調用加密庫。UM2262 在 6.2.3 和 6.2.4 節中提到了加密中間件支持,但它是模糊的。是否有其他文檔可以更好地解釋,或者可能是從用戶應用程序調用加密庫的具體
    發表于 12-26 06:48

    淺談C、C++ 和 ARM 匯編語言之間的調用

    之間的調用 本節提供一些示例,顯示如何從C++調用C和匯編語言代碼,以及從C和匯編語言調用 C++ 代碼。其中包括調用約定和數據類型。主要包
    發表于 10-19 09:24 ?2次下載

    python代碼示例之基于Python的日歷api調用代碼實例

    本文檔的主要內容詳細介紹的是python代碼示例之基于Python的日歷api調用代碼實例。
    發表于 09-06 14:25 ?42次下載
    python代碼<b class='flag-5'>示例</b>之基于Python的日歷api<b class='flag-5'>調用</b>代碼實例

    API-Shop-OCR-營業執照識別API接口Python調用示例代碼說明

    本文檔的主要內容詳細介紹的是API-Shop-OCR-營業執照識別API接口Python調用示例代碼說明
    發表于 01-10 11:48 ?6次下載
    API-Shop-OCR-營業執照識別API接口Python<b class='flag-5'>調用</b><b class='flag-5'>示例</b>代碼說明

    設計示例

    六設計示例
    的頭像 發表于 05-29 11:10 ?1459次閱讀
    設計<b class='flag-5'>示例</b>

    Labview的異步調用示例工程文件免費下載

    本文檔的主要內容詳細介紹的是Labview的異步調用示例vi工程文件免費下載
    發表于 10-14 08:00 ?23次下載
    Labview的異步<b class='flag-5'>調用</b><b class='flag-5'>示例</b>工程文件免費下載

    Arduino庫直接調用沒有原庫復雜調用有用的數據

    本文檔的主要內容詳細介紹的是Arduino庫直接調用沒有原庫復雜調用有用的數據免費下載。
    發表于 03-04 08:00 ?5次下載

    華為開發者HarmonyOS零基礎入門:系統能力調用示例

    華為開發者HarmonyOS零基礎入門:系統能力調用示例,修改組件屬性頁面加載參數接收數據連接,優化切換交互體驗。
    的頭像 發表于 10-23 10:44 ?1583次閱讀
    華為開發者HarmonyOS零基礎入門:系統能力<b class='flag-5'>調用</b><b class='flag-5'>示例</b>

    軟件示例:DA1468x 示例設置

    軟件示例:DA1468x 示例設置
    發表于 03-13 20:15 ?0次下載
    軟件<b class='flag-5'>示例</b>:DA1468x <b class='flag-5'>示例</b>設置

    SCL中調用函數的示例

    在此,可插入函數 (FC) 調用和函數塊 (FB) 調用。函數塊可作為單實例、多重實例或參數實例進行調用
    的頭像 發表于 06-06 10:18 ?2783次閱讀

    移動數據的編程示例

    編程示例 在此編程示例中,將移動在生產班次期間為示例收集的數據值以作進一步處理。收集的數據放在 ARRAY 中。通過“MOVE_BLK_VARIANT:移動塊”(Move block) 指令,可以
    的頭像 發表于 08-23 10:10 ?1855次閱讀
    移動數據的編程<b class='flag-5'>示例</b>

    reset API使用示例步驟

    時鐘和復位是兩個不同的驅動,但通常都是由負責clock驅動的人,把reset驅動完成。同樣,reset驅動也是由芯片廠商去完成的。 reset API使用示例 基本步驟: 1、調用
    的頭像 發表于 09-27 14:17 ?1548次閱讀

    python調用windows命令

    Windows命令,提供一些實際的示例和代碼。 首先,我們需要了解一些基本概念。Windows命令是一種命令行界面(CLI),它允許用戶通過鍵入命令來與操作系統進行交互。Python提供了一個名為 subprocess 的內置模塊,它允許我們在Python程序中執行外部命令。 調
    的頭像 發表于 11-29 14:34 ?1370次閱讀

    HAL庫的函數調用示例

    HAL(Hardware Abstraction Layer,硬件抽象層)庫是STM32等微控制器中常用的庫,它為開發者提供了訪問和控制硬件設備的接口。以下是一些常用的HAL庫函數及其調用示例: 一
    的頭像 發表于 12-02 14:01 ?1431次閱讀
    主站蜘蛛池模板: 色婷婷亚洲综合五月 | 色婷婷六月丁香在线观看 | 色综合天天综合网亚洲影院 | 国产亚洲欧美日本一二三本道 | 真实的国产乱xxxx在线 | www狠狠干| 国产欧美高清 | 啪啪网视频 | 69日本xxxxxxxxx78 69日本xxxxxxxxx96 | 手机在线看片你懂的 | 国产精品久久久久免费 | 欧美色惰aⅴ | 国产欧美视频在线 | 888米奇在线视频四色 | 又粗又大又爽又色又过瘾视频 | 黄色视网站 | 手机看片1024福利 | 天天做天天爱天天一爽一毛片 | 日本国产在线观看 | 久久综合五月婷婷 | 91一区二区三区四区五区 | 日本不卡一区二区三区在线观看 | 伊人精品视频在线 | 亚洲黄色天堂 | 日本大片免a费观看在线 | 日本一区二区三区四区在线观看 | 91久久人澡人人添人人爽 | 亚洲不卡视频在线观看 | 特级aaa片毛片免费观看 | 午夜视频网址 | 中文字幕国产一区 | 神马福利 | 中文字幕在线观看一区二区 | 日韩一级一欧美一级国产 | 午夜视频在线免费 | 99久久香蕉国产综合影院 | 永久视频免费 | 热99视频 | 激情网五月 | 77米奇影院 | 色婷婷久久 |