語言

MethodHandle 類別

定義

方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。

[Android.Runtime.Register("java/lang/invoke/MethodHandle", ApiSince=26, DoNotGenerateAcw=true)]
public abstract class MethodHandle : Java.Lang.Object
[<Android.Runtime.Register("java/lang/invoke/MethodHandle", ApiSince=26, DoNotGenerateAcw=true)>]
type MethodHandle = class
    inherit Object
繼承
MethodHandle
屬性

備註

方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。 這些轉換相當通用,包含 #asType 轉換、#bindTo 插入、java.lang.invoke.MethodHandles#dropArguments 刪除,以及 java.lang.invoke.MethodHandles#filterArguments 替換等模式。

<h1>方法句柄內容/<h1> 方法句柄會根據其參數與回傳類型動態且強型態設定。 它們不以底層方法的名稱或定義類別來區分。 方法句柄必須使用符號型別描述符來呼叫,該描述符必須與該方法代柄自身的 #type 型別描述符相符。

每個方法的 handle 都會透過 access(存取器 #type type )回報其型別描述符。 這個型別描述符是一個 java.lang.invoke.MethodType MethodType 物件,其結構是一系列類別,其中一個是方法的回傳型別(若 void.class 無則為)。

方法的 handle 型別控制它接受的呼叫類型,以及適用於它的轉換類型。

一個方法句柄包含一對稱為 #invokeExact invokeExact#invoke invoke的特殊調用方法。 這兩種呼叫器方法都提供直接存取方法把柄底層的方法、建構子、欄位或其他操作,這些操作會經過參數與回傳值的轉換而改變。 兩個呼叫器都接受與方法句柄自身型別完全相符的呼叫。 簡單且不精確的呼叫器也接受多種其他呼叫類型。

方法句柄是不可變的,且沒有可見的狀態。 當然,它們也可以綁定在顯示狀態的底層方法或資料上。 就 Java 記憶體模型而言,任何方法的 handle 都會像是所有(內部)欄位都是最終變數。 這表示任何對應用程式可見的方法句柄都會是完整成形的。 即使方法的句柄是透過資料競量中的共享變數發佈,這點也成立。

方法的句柄無法被使用者子分類。 實作可能會(也可能不會)建立內部子類別,這些子類別 MethodHandle 可以透過操作 java.lang.Object#getClass Object.getClass 可見。 程式設計師不應從特定類別中推斷方法句柄,因為方法處理類別的階層結構(若有)可能會隨時間或不同廠商的實作而改變。

<h1>方法句柄編譯</h1> Java 方法呼叫表達式命名invokeExact,或invoke可從 Java 原始碼調用方法柄。 從原始碼的角度來看,這些方法可以接受任何參數,其結果可以被鑄造成任何回傳型別。 形式上,這是透過賦予調用者方法 Object 回傳型別和變數元參數 Object 來實現的,但它們還有一項額外的特性稱為 <em>signature polymorphism</em> ,將這種調用自由直接連結到 JVM 執行堆疊。

如同虛擬方法,原始碼層級呼叫 invokeExactinvoke 編譯為 invokevirtual 指令。 較為特殊的是,編譯器必須記錄實際的參數類型,且不得對參數進行方法調用轉換。 相反地,它必須根據他們自己未轉換的類型推送他們。 method handle 物件本身會先推送到堆疊中,再排在參數之前。 編譯器接著用符號型別描述符的參數與回傳型別來呼叫方法的句柄。

要發出完整的符號型別描述符,編譯器還必須確定回傳型別。 這是基於在方法呼叫表達式上施放(如果有的話),或 Object 如果呼叫是表達式,否則 void 是陳述式。 鑄造可能屬於原始型(但不 void一定)。

作為一個角落情況,未鑄造null的參數會被賦予一個符號型描述子。java.lang.Void 與型別 Void 的歧義無害,因為除了空參考外,沒有其他型別 Void 的參考。

<h1>方法處理呼叫</h1> 指令首次 invokevirtual 執行時,透過符號方式解析指令中的名稱並驗證方法呼叫是否靜態合法,進行連結。 這對於調到 invokeExactinvoke時也成立。 此時,編譯器所發出的符號型別描述符會被檢查語法是否正確,並解析其包含的名稱。 因此, invokevirtual 只要符號型別描述符在語法上良好且型別存在,呼叫方法代碼的指令就會自動連結。

當 在連結後執行時 invokevirtual ,JVM 會先檢查接收方法的 handle 型別,以確保其與符號型別描述符相符。 若型別匹配失敗,表示呼叫者所呼叫的方法不存在於被呼叫的個別方法句柄中。

在 的情況下 invokeExact,調用的型別描述符(解析符號型別名稱後)必須與接收方法的 handle 方法型別完全匹配。 在純且不精確 invoke的情況下,解析型別描述符必須是接收方 #asType asType 方法的有效參數。 因此,純 invoke 比 更為寬鬆。invokeExact

型別匹配後,呼叫即可 invokeExact 直接且立即呼叫方法底層的方法(或其他行為)。

invoke若呼叫者指定的符號型別描述符與方法代柄自身的型別完全相同,則呼叫純 的呼叫與呼叫 的運作方式相同invokeExact。 若存在型別不匹配,invoke會嘗試調整接收方法的代言型,如同呼叫 ,#asType asType以獲得一個完全可調用的方法代言。M2 這讓呼叫者與被呼叫者之間能更有效地協商方法類型。

(<em 註:>/em< 調整後的方法 handle > 無法直接觀察,因此無需實作來M2實現它。)

<h1>呼叫檢查</h1> 在典型程式中,方法的句柄類型匹配通常會成功。 但若匹配失敗,JVM 會直接拋出 ,或WrongMethodTypeException間接拋出invokeExact,如呼叫失敗asTypeinvoke若 ),。

因此,在靜態型別程式中可能出現的連結錯誤,在使用方法句柄的程式中,可能出現為動態 WrongMethodTypeException 不符。

由於方法型別包含「活」 Class 物件,方法型別匹配會同時考量型別名稱與類別載入器。 因此,即使一個方法的句柄 M 在一個類別載入器 L1 中建立並用於另一個 L2類別載入器,方法的句柄呼叫仍然是型別安全的,因為呼叫者的符號型態描述符(如在 L2中解析)會與原始被叫方方法的符號型別描述符(如 L1在 中解析)相匹配。 當 建立並指派其型別時,L1解算 in M 發生,而 的L2解決則發生在invokevirtual指令被連結時。

除了檢查型別描述符外,方法句柄呼叫其底層方法的能力是無限制的。 如果某個方法的代言人在非公開方法上由有權限的類別建立,任何收到該代言的呼叫者都可以在任何地點使用該代言。

與核心反射 API 不同,後者每次呼叫反映式方法時都會檢查存取權,而方法句柄存取檢查則是在建立方法句柄時進行。 在(見下文) ldc 的情況下,存取檢查是作為連結常數方法底層的常數池條目的一部分而執行。

因此,非公開方法或非公開類別中方法的句柄通常應保密。 除非使用這些程式碼本身無害,否則不應被傳遞給不受信任的程式碼。

<h1>方法句柄建立</h1> Java 程式碼可以建立一個方法句柄,直接存取該程式碼可存取的任何方法、建構子或欄位。 這是透過一個稱為 java.lang.invoke.MethodHandles.Lookup MethodHandles.Lookup 的反射性、基於能力的 API 來完成的。例如,靜態方法的句柄可以從 java.lang.invoke.MethodHandles.Lookup#findStatic Lookup.findStatic中取得。 也有從核心反射 API 物件轉換的方法,例如 java.lang.invoke.MethodHandles.Lookup#unreflect Lookup.unreflect

如同類別與字串,對應可存取欄位、方法與建構子的方法代言詞,也可以直接在類別檔案的常數池中表示,作為由位元組碼載入 ldc 的常數。 一種新型的常數池條目 CONSTANT_MethodHandle,直接指的是相關的 CONSTANT_MethodrefCONSTANT_InterfaceMethodref,或稱 CONSTANT_Fieldref 常數池的條目。 (關於方法柄常數的完整細節,請參閱 Java 虛擬機器規範的第 4.4.8 與 5.4.3.5 節。)

透過查找或從可變元修飾位元(0x0080)產生的方法或建構子產生的方法元,具有對應的變元元,彷彿它們是由 的幫助 #asVarargsCollector asVarargsCollector下定義的。

方法參考可以指靜態或非靜態方法。 在非靜態情況下,方法的 handle 類型包含一個明確的接收者參數,該參數會置於其他參數之前。 在方法代言的型別中,初始接收者參數依據該方法最初被請求的類別類型來型別。 (例如,若透過 ldc取得非靜態方法的 handle ,接收器的型別即為常數池項目中所命名的類別。)

方法的句柄常數會受到相同的連結時間存取檢查,對應的位元碼指令也相同,若位元組碼行為會產生相應的連結錯誤,指令 ldc 也會拋出相應的連結錯誤。

作為推論,存取受保護成員的權限僅限於存取類別或其子類別的接收者,而存取類別必須是受保護成員定義類別的子類別(或封包兄弟姊妹)。 若方法參考指向目前封裝外的受保護非靜態方法或類別欄位,接收參數將縮減至存取類別的類型。

當呼叫虛擬方法的方法句柄時,該方法總是在接收端(即第一個參數)中被查詢。

也可以建立針對特定虛擬方法實作的非虛擬方法句柄。 這些系統不會根據接收器類型進行虛擬查找。 此類方法的控制柄模擬指令對同一方法的影響 invokespecial

<h1>用法範例</h1> 以下是一些用法範例: <blockquote>

{@code
            Object x, y; String s; int i;
            MethodType mt; MethodHandle mh;
            MethodHandles.Lookup lookup = MethodHandles.lookup();
            // mt is (char,char)String
            mt = MethodType.methodType(String.class, char.class, char.class);
            mh = lookup.findVirtual(String.class, "replace", mt);
            s = (String) mh.invokeExact("daddy",'d','n');
            // invokeExact(Ljava/lang/String;CC)Ljava/lang/String;
            assertEquals(s, "nanny");
            // weakly typed invocation (using MHs.invoke)
            s = (String) mh.invokeWithArguments("sappy", 'p', 'v');
            assertEquals(s, "savvy");
            // mt is (Object[])List
            mt = MethodType.methodType(java.util.List.class, Object[].class);
            mh = lookup.findStatic(java.util.Arrays.class, "asList", mt);
            assert(mh.isVarargsCollector());
            x = mh.invoke("one", "two");
            // invoke(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;
            assertEquals(x, java.util.Arrays.asList("one","two"));
            // mt is (Object,Object,Object)Object
            mt = MethodType.genericMethodType(3);
            mh = mh.asType(mt);
            x = mh.invokeExact((Object)1, (Object)2, (Object)3);
            // invokeExact(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
            assertEquals(x, java.util.Arrays.asList(1,2,3));
            // mt is ()int
            mt = MethodType.methodType(int.class);
            mh = lookup.findVirtual(java.util.List.class, "size", mt);
            i = (int) mh.invokeExact(java.util.Arrays.asList(1,2,3));
            // invokeExact(Ljava/util/List;)I
            assert(i == 3);
            mt = MethodType.methodType(void.class, String.class);
            mh = lookup.findVirtual(java.io.PrintStream.class, "println", mt);
            mh.invokeExact(System.out, "Hello, world.");
            // invokeExact(Ljava/io/PrintStream;Ljava/lang/String;)V
            }

</blockquote> 上述每一次呼叫 或 invokeExact plain invoke 都會產生一個帶有符號型別描述符的 invokevirtual 指令,詳見下方註解。 在這些例子中,輔助方法 assertEquals 被假設為呼叫 java.util.Objects#equals(Object,Object) Objects.equals 其參數,並斷言結果為真的方法。

<h1>例外</h1>invokeExactinvoke 方法與 被宣告拋出 java.lang.Throwable Throwable,也就是說方法的處理無法投擲什麼,沒有靜態限制。 由於 JVM 不區分已檢查與未檢查的例外(當然除了類別區分),因此將檢查異常歸因於方法句柄呼叫對位元組碼形狀並無特別影響。 但在 Java 原始碼中,執行方法處理呼叫的方法必須明確拋出 Throwable,否則必須在本地捕捉所有投擲,只重新拋出在上下文中合法的投擲,並包裝非法的投擲。

<h1>「sigpoly」>簽名多態<性/h1> 與 invokeExactinvoke特殊編譯與連結行為稱為 <em>簽名多態<性/em>。 根據 Java 語言規範的定義,簽章多態方法是指能夠操作任意多種呼叫簽章與回傳類型的方法。

在原始碼中,呼叫簽名多態方法時,無論請求的符號型別描述符為何,都會被編譯。 如同慣例,Java 編譯器會針對指定方法發出invokevirtual帶有符號型別描述符的指令。 不尋常的是,符號型別描述符是從實際的參數和回傳類型衍生而來,而非方法宣告。

當 JVM 處理包含簽名多態呼叫的位元碼時,無論其符號型別描述符為何,都能成功連結任何此類呼叫。 (為維持型別安全,JVM 會以適當的動態型別檢查來保護此類呼叫,如其他地方所述。)

位元組碼產生器,包括編譯器後端,必須為這些方法輸出未轉換的符號型別描述符。 判定符號連結的工具必須接受這些未轉換的描述符,且不會報告連結錯誤。

<h1>方法句柄與核心反射API<之間的互通/h1> 利用API中的 java.lang.invoke.MethodHandles.Lookup Lookup 工廠方法,任何由核心反射API物件代表的類別成員都可以轉換為行為等價的方法句柄。 例如,反射式 java.lang.reflect.Method Method 可以用 轉換為方法柄 java.lang.invoke.MethodHandles.Lookup#unreflect Lookup.unreflect。 所得的方法把柄通常能更直接且有效地存取底層類別成員。

作為特殊情況,當使用 Core Reflection API 來檢視此類別的簽名多態方法 invokeExact 或純粹 invoke 時,它們會呈現為普通的非多態方法。 它們在 所 java.lang.Class#getDeclaredMethod Class.getDeclaredMethod見的反射外觀,不受其在此 API 中的特殊地位影響。 例如, java.lang.reflect.Method#getModifiers Method.getModifiers 會精確回報任何類似宣告方法所需的修飾位元,包括此例 native 中的 和 varargs 位元。

如同任何反射方法,這些方法(當反射時)可透過 java.lang.reflect.Method#invoke java.lang.reflect.Method.invoke來調用。 然而,這類反射呼叫不會產生方法柄的呼叫。 若此呼叫傳遞所需的參數(一個型別 Object[]為 的 參數),將忽略該參數並拋出一個 UnsupportedOperationException

由於 invokevirtual 指令可在任何符號型別描述符下原生調用方法句柄,這種反映觀點與這些方法以位元碼呈現的做法相衝突。 因此,這兩種原生方法在 的 Class.getDeclaredMethod反思下可視為佔位符。

為了取得特定型別描述符的調用方法,請使用 java.lang.invoke.MethodHandles#exactInvoker MethodHandles.exactInvoker, 或 java.lang.invoke.MethodHandles#invoker MethodHandles.invoker。 API java.lang.invoke.MethodHandles.Lookup#findVirtual Lookup.findVirtual 也能回傳一個方法句柄來呼叫 invokeExact 或明文 invoke,針對任意指定的型別描述符。

<h1>方法代言人與 Java 泛型<之間的互通/h1> 方法代言碼可以獲得,該方法代號可以用 Java 泛型類型宣告的方法、建構子或欄位。 與 Core Reflection API 類似,方法代柄的型別將由原始碼層型別的擦除構建而成。 當呼叫方法句柄時,其參數的型別或回傳值鑄造型別可能是通用型態或型別實例。 若發生這種情況,編譯器會在建構指令符號型別描述符 invokevirtual 時,將其替換為這些型別的擦除值。

方法句柄並未以 Java 參數化(通用)型別來表示其類函式型別,因為類函數型別與參數化 Java 型別之間存在三個不匹配。 <ul><li>方法類型涵蓋所有可能的元數,從無參數到最多允許的參數數。 泛型符號不是變異的,因此無法代表這一點。</li><li>方法 型別可以指定原始型態的參數,而 Java 泛型無法涵蓋這些參數。</li><li>方法把柄上的高階函數(組合子)通常在多種函數類型中通用,包括多元函數。 用 Java 型態參數來表示這種通用性是不可能的。</li></ul>

<h1>「最大值」>元數限制</h1> JVM 對所有方法與構造子施加絕對限制,為 255 個堆疊參數。 此限制在某些情況下可能更具限制性: <ul><li>A longdouble 參數(為參數限制)視為兩個參數槽。 <li>非靜態方法會為該方法所呼叫的物件額外消耗一個參數。 <li>建構子會消耗一個額外的參數,該物件被建構的對象。 <li>因為一個方法 handleS invoke 方法(或其他簽名多態方法)是非虛擬的,除了任何非虛擬接收物件外,還會額外佔用方法把柄的一個參數。 </ul> 這些限制意味著某些方法的句柄無法被建立,僅僅因為 JVM 對堆疊參數的限制。 例如,如果一個靜態 JVM 方法正好接受 255 個參數,則無法為它建立方法句柄。 嘗試用不可能的方法型別建立方法句柄會導致 IllegalArgumentException。 特別是,一個方法的 handleS 型態的 A. 必須不完全達到最大值 255。

java.lang.invoke.MethodHandleJava 檔。

本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。

建構函式

名稱 Description
MethodHandle(IntPtr, JniHandleOwnership)

方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。

屬性

名稱 Description
Class

回傳此 Object的執行時類別。

(繼承來源 Object)
Handle

底層 Android 實例的帳號。

(繼承來源 Object)
IsVarargsCollector

判斷此方法處理是否支援 #asVarargsCollector 變元數呼叫。

JniIdentityHashCode

取得由互通執行時指派給此 Java 對等端的身份雜湊碼。

(繼承來源 Object)
JniManagedPeerState

方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。

(繼承來源 JavaObject)
JniPeerMembers

方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。

PeerReference

取得這個 Java 節點的 JNI 物件參考。

(繼承來源 Object)
ThresholdClass

方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。

ThresholdType

方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。

方法

名稱 Description
AsCollector(Class, Int32)

建立一個 <em>陣列收集</em> 方法的 handle,接受一定數量的後方位置參數並將它們收集成一個陣列參數。

AsCollector(Int32, Class, Int32)

製作一個 <em>陣列收集</em> 方法的 handle,接受從某一位置開始的指定數量位置參數,並將其收集成陣列參數。

AsFixedArity()

建立 <一個 em>固定元</em> 方法的 handle ,其他方面等同於目前的方法 handle。

AsSpreader(Class, Int32)

製作一個 <em>陣列擴展</em> 方法的handle,接受後方陣列參數,並將其元素擴展為位置參數。

AsSpreader(Int32, Class, Int32)

製作一個 <em>陣列擴展</em> 方法的 handle,能在指定位置接受陣列參數,並將其元素以位置參數形式分散,取代陣列。

AsType(MethodType)

產生一個適配方法把柄,將目前方法柄的型別調整成新型別。

AsVarargsCollector(Class)

它製作了一個 <em>變數 arity</em> 適配器,能夠接受任意數量的後方位置參數並將其收集成陣列參數。

BindTo(Object)

將值 x 綁定到方法句柄的第一個參數,但不呼叫該參數。

Clone()

建立並回傳此物件的副本。

(繼承來源 Object)
Construct(JniObjectReference, JniObjectReferenceOptions)

方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。

(繼承來源 JavaObject)
Dispose()

釋放該 Java 節點所持有的資源。

(繼承來源 Object)
Dispose(Boolean)

釋放該 Java 節點所持有的資源。

(繼承來源 Object)
DisposeUnlessReferenced()

方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。

(繼承來源 JavaObject)
Equals(Object)

方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。

(繼承來源 JavaObject)
Equals(Object)

表示是否有其他物體「等同」於此物。

(繼承來源 Object)
GetHashCode()

回傳物件的雜湊碼值。

(繼承來源 Object)
Invoke(Object[])

呼叫方法代柄,允許任何呼叫者類型的描述符,並可選擇性地對參數與回傳值進行轉換。

InvokeExact(Object[])

呼叫方法代柄,允許任何呼叫者類型描述符,但需完全匹配型別。

InvokeWithArguments(IList<Object>)

執行變數元率調用,將給定陣列中的參數傳入方法代柄,就像透過一個只提及型別 #invoke invoke、元數為參數陣列長度的呼叫站點的不精確Object值一樣。

InvokeWithArguments(Object[])

執行變項元值調用,將給定清單中的參數傳入方法代柄,就像透過一個只提及型別 #invoke invoke、元數為參數清單長度的呼叫站點的不精確Object值一樣。

JavaFinalize()

當垃圾回收判定該物件不再有相關參考時,由垃圾回收器呼叫。

(繼承來源 Object)
Notify()

喚醒一個正在該物件監視器上等待的執行緒。

(繼承來源 Object)
NotifyAll()

喚醒所有等待該物件監視器的執行緒。

(繼承來源 Object)
SetHandle(IntPtr, JniHandleOwnership)

設定 Handle 屬性。

(繼承來源 Object)
SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。

(繼承來源 JavaObject)
ToArray<T>()

從這個 Java 陣列包裝器建立一個受管理陣列。

(繼承來源 Object)
ToString()

回傳物件的字串表示。

(繼承來源 Object)
Type()

報告此方法的處理類型。

UnregisterFromRuntime()

將此 Java 節點從互通執行時中取消註冊。

(繼承來源 Object)
Wait()

導致目前執行緒等待被喚醒,通常是透過 <em>通知</><em 或 em>中斷</em> 來喚醒。

(繼承來源 Object)
Wait(Int64, Int32)

會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。

(繼承來源 Object)
Wait(Int64)

會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。

(繼承來源 Object)
WithVarargs(Boolean)

若布林旗標為真,則調整此方法的 handle 為 #asVarargsCollector 變元數,否則 #asFixedArity 固定元數。

明確介面實作

名稱 Description
IJavaPeerable.Disposed()

方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。

(繼承來源 JavaObject)
IJavaPeerable.Finalized()

方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。

(繼承來源 JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。

(繼承來源 JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。

(繼承來源 JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。

(繼承來源 JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。

(繼承來源 JavaObject)

擴充方法

名稱 Description
GetJniTypeName(IJavaPeerable)

取得實例 self類型的 JNI 名稱。

JavaAs<TResult>(IJavaPeerable)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

JavaCast<TResult>(IJavaObject)

執行 Android 執行時檢查型別轉換。

JavaCast<TResult>(IJavaObject)

方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。

TryJavaCast<TResult>(IJavaPeerable, TResult)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

適用於