MethodHandle 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。
[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
- 繼承
- 屬性
備註
方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。 這些轉換相當通用,包含 #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 執行堆疊。
如同虛擬方法,原始碼層級呼叫 invokeExact 並 invoke 編譯為 invokevirtual 指令。 較為特殊的是,編譯器必須記錄實際的參數類型,且不得對參數進行方法調用轉換。 相反地,它必須根據他們自己未轉換的類型推送他們。 method handle 物件本身會先推送到堆疊中,再排在參數之前。 編譯器接著用符號型別描述符的參數與回傳型別來呼叫方法的句柄。
要發出完整的符號型別描述符,編譯器還必須確定回傳型別。 這是基於在方法呼叫表達式上施放(如果有的話),或 Object 如果呼叫是表達式,否則 void 是陳述式。 鑄造可能屬於原始型(但不 void一定)。
作為一個角落情況,未鑄造null的參數會被賦予一個符號型描述子。java.lang.Void 與型別 Void 的歧義無害,因為除了空參考外,沒有其他型別 Void 的參考。
<h1>方法處理呼叫</h1> 指令首次 invokevirtual 執行時,透過符號方式解析指令中的名稱並驗證方法呼叫是否靜態合法,進行連結。 這對於調到 invokeExact 和 invoke時也成立。 此時,編譯器所發出的符號型別描述符會被檢查語法是否正確,並解析其包含的名稱。 因此, 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,如呼叫失敗asType(invoke若 ),。
因此,在靜態型別程式中可能出現的連結錯誤,在使用方法句柄的程式中,可能出現為動態 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_Methodref、 CONSTANT_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> 與 invokeExact 的invoke特殊編譯與連結行為稱為 <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 long 或 double 參數(為參數限制)視為兩個參數槽。
<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 |
回傳此 |
| 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) |
將值 |
| 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>) |
執行變數元率調用,將給定陣列中的參數傳入方法代柄,就像透過一個只提及型別 |
| InvokeWithArguments(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) |
取得實例 |
| JavaAs<TResult>(IJavaPeerable) |
試著強制 |
| JavaCast<TResult>(IJavaObject) |
執行 Android 執行時檢查型別轉換。 |
| JavaCast<TResult>(IJavaObject) |
方法代柄是一種有型別且可直接執行的參考,指向底層的方法、建構子、欄位或類似的低階操作,並可選擇參數或回傳值的轉換。 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
試著強制 |