語言

IMethodHandleInfo 介面

定義

透過將直接方法柄破解為其連貫符號部分所獲得的符號參考。

[Android.Runtime.Register("java/lang/invoke/MethodHandleInfo", "", "Java.Lang.Invoke.IMethodHandleInfoInvoker", ApiSince=26)]
public interface IMethodHandleInfo : Android.Runtime.IJavaObject, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("java/lang/invoke/MethodHandleInfo", "", "Java.Lang.Invoke.IMethodHandleInfoInvoker", ApiSince=26)>]
type IMethodHandleInfo = interface
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
屬性
實作

備註

透過將直接方法柄破解為其連貫符號部分所獲得的符號參考。 要破解直接方法的 handle,請呼叫 Lookup#revealDirect Lookup.revealDirect。 <h1>「directmh」>直接方法句柄/<h1><em>直接方法handle</em> 表示一個方法、建構子或欄位,且不存在任何中間參數綁定或其他轉換。 直接方法句柄所指涉的方法、建構子或欄位稱為其 <em>底層成員</em>。 直接方法的句柄可以透過以下任一方式獲得:<ul><li>透過對常數執行ldc指令CONSTANT_MethodHandle。 (參見 Java 虛擬機規範,第 4.4.8 與 5.4.3 節。) <li>透過呼叫其中一個 Lookup Factory 方法,Lookup#findVirtual Lookup.findVirtual例如 ,將符號引用解析為方法句柄。 符號參考由類別、名稱字串和型別組成。 <li>透過呼叫工廠方法 Lookup#unreflect Lookup.unreflect 或 Lookup#unreflectSpecial Lookup.unreflectSpecial 將 a Method 轉換成方法句柄。 <透過>呼叫工廠方法 Lookup#unreflectConstructor Lookup.unreflectConstructor 將 a Constructor 轉換成方法 handle 。 <li>透過呼叫工廠方法 Lookup#unreflectGetter Lookup.unreflectGetter 或 Lookup#unreflectSetter Lookup.unreflectSetter 將 a Field 轉換成方法句柄。 </ul>

<h1>破解<限制/h1> 給定合適的 Lookup 物件,可以破解任何直接方法的柄,以恢復底層方法、建構子或欄位的符號參考。 破解必須透過 Lookup 與建立目標方法句柄的物件相符,或擁有足夠存取權限以重建等效方法柄的物件進行。

如果底層方法是呼叫者敏感的,直接方法的 handle 會被「綁定」到特定的呼叫類別,也就是用來建立該物件的 java.lang.invoke.MethodHandles.Lookup#lookupClass() 查找類別。 即使底層方法是公開的(例如 ),即使底層方法是公開的(例如 Class.forName),用不同的查找類別破解此方法句柄也會失敗。

查詢物件匹配的需求,為那些可能信任來自意外範圍的符號資訊(或呼叫者綁定)錯誤揭露方法句柄的程式提供了「快速失敗」行為。 用 java.lang.invoke.MethodHandles#reflectAs 來覆蓋這個限制。

<h1>“refkinds”>參考種類</h1> 查找工廠方法對應所有主要的方法、建構子與欄位的使用情境。 這些使用情境可用小整數區分如下:<表格邊框=1 cellpadding=5 summary=「參考種類」><tr><th>reference kind</th><th>描述名稱</th><th>scope< / th><th>成員</th><th 行為></><th/tr><tr><td>1</td><td>REF_getField</td><td>class</td td/td><td/td td>tdFT f;<><>/TD(T) this.f;</TR><TR><TD><>/TD TD/TD2<><> TD/TDREF_getStatic<>< 或 /TD>classTDinterface<>BR<>static<>/TDFT f;TD<><>/TD(T) C.f;</TR><TR><TD><>/TD3TD<><>/TD TD/TDREF_putFieldTD<><>/TDclass<><>/TD/FT f;<><>this.f = x;<><TD TR ><><達陣>4</達陣><TD>REF_putStatic</TD><達>class<陣/TD><>static<達陣 BR>FT f;</TD TD><>C.f = arg;/TD<></TR><TR TD><>5</TD><TD>REF_invokeVirtual</TD TD/TD><TD>class</TD TD/TD><TD>T m(A*);</TD><>(T) this.m(arg*);<><>< 轉換 TR><達陣>6</達陣><達>REF_invokeStatic<陣/達><>class陣 或interface< /TD><達陣 BR>static</>T m(A*);<TD 達><>(T) C.m(arg*);陣/<>TD</TR><TR TD><>7</TD><>REF_invokeSpecial< TD/TD><>class TD 或 /TD TD/TD 或 interface</TD><TD>T m(A*);</TD><>(T) super.m(arg*);</><TD/TR達陣><><> 達陣/達8陣 達<><>陣/達REF_newInvokeSpecial<><>陣 達陣/達class<陣 達><>陣/達C(A*);<><>new C(arg*);<><陣 達陣/達陣 TR 達陣><>/<>9<達陣 達陣 達><>陣/達REF_invokeInterface<><>陣 達陣/達interface<><>T m(A*);<><>(T) this.m(arg*);<陣/抄截/表格><><>

新增於1.8版本。

的 java.lang.invoke.MethodHandleInfoJava 檔。

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

屬性

名稱 Description
DeclaringClass

回傳破解方法把柄底層成員所定義的類別。

Handle

取得底層 Android 物件的 JNI 值。

(繼承來源 IJavaObject)
IsVarArgs

判斷底層成員是可變元度方法還是構造子。

JniIdentityHashCode

回傳包裹實例的 java.lang.System.identityHashCode() 值。

(繼承來源 IJavaPeerable)
JniManagedPeerState

管理貴族的狀況。

(繼承來源 IJavaPeerable)
JniObjectReferenceControlBlock

透過將直接方法柄破解為其連貫符號部分所獲得的符號參考。

(繼承來源 IJavaPeerable)
JniPeerMembers

成員存取與召喚支援。

(繼承來源 IJavaPeerable)
MethodType

回傳破解符號參考的名義型別,以方法型別表示。

Modifiers

回傳底層成員的存取修飾符。

Name

回傳破解方法手柄底層成員的名稱。

PeerReference

回傳JniObjectReference包裹後的 Java 物件實例。

(繼承來源 IJavaPeerable)
ReferenceKind

回傳破解方法句柄的參考型態,進而判斷該方法柄的底層成員是建構子、方法還是欄位。

方法

名稱 Description
Disposed()

當實例被處理後才被召喚。

(繼承來源 IJavaPeerable)
DisposeUnlessReferenced()

如果沒有未解決的參考資料,則 Dispose()呼叫;否則,則不做任何事。

(繼承來源 IJavaPeerable)
Finalized()

當實例完成後才會被通知。

(繼承來源 IJavaPeerable)
ReferenceKindToString(ReferenceKind)

回傳給定參考類型描述名稱,如上表所定義。

RefKindIsField(ReferenceKind)

此會員已被棄用。

RefKindIsValid(ReferenceKind)

此會員已被棄用。

RefKindName(ReferenceKind)

此會員已被棄用。

ReflectAs(Class, MethodHandles+Lookup)

反映底層成員為方法、建構子或欄位物件。

SetJniIdentityHashCode(Int32)

將回傳的值設為 JniIdentityHashCode。

(繼承來源 IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

透過將直接方法柄破解為其連貫符號部分所獲得的符號參考。

(繼承來源 IJavaPeerable)
SetPeerReference(JniObjectReference)

將回傳的值設為 PeerReference。

(繼承來源 IJavaPeerable)
ToString(ReferenceKind, Class, String, MethodType)

回傳一個字串表示,給 MethodHandleInfo定其符號參照的四個部分。

UnregisterFromRuntime()

取消註冊此實例,讓執行時不會在未來 Java.Interop.JniRuntime+JniValueManager.PeekValue 的呼叫中回傳該實例。

(繼承來源 IJavaPeerable)

擴充方法

名稱 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 端是否有效。

適用於