Language

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
属性
実装

注釈

ダイレクト メソッド ハンドルをそのコンシット記号部分に割り込むことで得られるシンボリック参照。 ダイレクト メソッド ハンドルを解読するには、 Lookup#revealDirect Lookup.revealDirectを呼び出します。 <h1>"directmh">Direct メソッド ハンドル</h1><em>direct メソッド ハンドル</em> は、引数のバインドやその他の変換を介入せずに、メソッド、コンストラクター、またはフィールドを表します。 ダイレクト メソッド ハンドルによって参照されるメソッド、コンストラクター、またはフィールドは、その <em>基になるメンバー</em>と呼ばれます。 ダイレクト メソッド ハンドルは、次のいずれかの方法で取得できます。<ul><li>ldc定数に対してCONSTANT_MethodHandle命令を実行します。 (Java仮想マシンの仕様、セクション 4.4.8 および 5.4.3 を参照してください)。<li>シンボル参照をメソッド ハンドルに解決するには、Lookup#findVirtual Lookup.findVirtual などの Lookup Factory メソッドのいずれかを呼び出します。 シンボリック参照は、クラス、名前文字列、および型で構成されます。 <li>ファクトリ メソッド Lookup#unreflect Lookup.unreflect 呼び出すか、 Lookup#unreflectSpecial Lookup.unreflectSpecial を呼び出して、 Method をメソッド ハンドルに変換します。 <li>Lookup#unreflectConstructor Lookup.unreflectConstructorをメソッド ハンドルに変換するためにConstructorファクトリ メソッドを呼び出します。 <li>ファクトリ メソッド Lookup#unreflectGetter Lookup.unreflectGetter 呼び出すか、 Lookup#unreflectSetter Lookup.unreflectSetter を呼び出して、 Field をメソッド ハンドルに変換します。 </ul>

<h1> Cracking</h1> 適切な Lookup オブジェクトを指定すると、基になるメソッド、コンストラクター、またはフィールドのシンボリック参照を回復するために、ダイレクト メソッド ハンドルを解読できます。 クラッキングは、ターゲット メソッド ハンドルを作成したオブジェクトと同等の Lookup オブジェクトを介して行うか、同等のメソッド ハンドルを再作成するのに十分なアクセス許可を持つオブジェクトを介して行う必要があります。

基になるメソッドが呼び出し元の機密性の高い場合、ダイレクト メソッド ハンドルは、特定の呼び出し元クラス (java.lang.invoke.MethodHandles.Lookup#lookupClass() 参照クラス) に "バインド" され、その作成に使用されます。 基になるメソッドがパブリック ( Class.forName など) であっても、このメソッド ハンドルを別の参照クラスで解読すると失敗します。

参照オブジェクトの照合の要件は、予期しないスコープからのシンボリック情報 (または呼び出し元のバインド) を使用してメソッド ハンドルの誤った啓示を信頼する可能性があるプログラムに対して"高速失敗" 動作を提供します。 この制限をオーバーライドするには、 java.lang.invoke.MethodHandles#reflectAs を使用します。

<h1>"refkinds">Reference の種類</h1> Lookup Factory メソッドは、メソッド、コンストラクター、およびフィールドのすべての主要なユース ケースに対応します。 これらのユース ケースは、小さな整数を使用して区別できます。<table border=1 cellpadding=5 summary="reference kind"><tr><th>reference kind</th><th>descriptive name</th><th>scope</th><th>thmember</th><th>behavior</th></tr><tr><td>1</td><td>REF_getField</td><td>class</td><td>FT f;</td><td>(T) this.f;</td></tr><tr><td>2</td><td>REF_getStatic</td><>classまたはinterface</td><td>static<br>FT f;</td><td>(T) C.f;</td></tr><tr><td>3</td><td>REF_putField</td><td>class</td><td>FT f;</td><td>this.f = x;</td></tr><trtr><td>4</td><td>REF_putStatic</td><td>class</td><td>static<br>FT f;</td><td>C.f = arg;</td></tr><tr><td>5</td><td>REF_invokeVirtual</td><td>class</td><td>T m(A*);</td><td>(T) this.m(arg*);</td></tr><tr><td>6</td><td>REF_invokeStatic</td><td>class または interface</td><td>static<br>T m(A*);</td><td>(T) C.m(arg*);</td></tr><><td>7</td><td>REF_invokeSpecial</td><td>class または interface</td><td>T m(A*);</td><td>(T) super.m(arg*);</td></tr><tr><td>8</td><td>REF_newInvokeSpecial</td><td>class</td><td>C(A*);</td><td>new C(arg*);</td></tr><tr><td>9</td><td>REF_invokeInterface</td><td>interface</td><td>T m(A*);</td><td>(T) this.m(arg*);</td></tr></table>

1.8 で追加されました。

Javaドキュメント。

このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。

プロパティ

名前 説明
DeclaringClass

cracked メソッド ハンドルの基になるメンバーが定義されたクラスを返します。

Handle

基になる Android オブジェクトの JNI 値を取得します。

(継承元 IJavaObject)
IsVarArgs

基になるメンバーが変数アリティ メソッドまたはコンストラクターであるかどうかを判断します。

JniIdentityHashCode

ラップされたインスタンスの java.lang.System.identityHashCode() の値を返します。

(継承元 IJavaPeerable)
JniManagedPeerState

マネージド ピアの状態。

(継承元 IJavaPeerable)
JniObjectReferenceControlBlock

ダイレクト メソッド ハンドルをそのコンシット記号部分に割り込むことで得られるシンボリック参照。

(継承元 IJavaPeerable)
JniPeerMembers

メンバー アクセスと呼び出しのサポート。

(継承元 IJavaPeerable)
MethodType

メソッド型として表される、割れたシンボリック参照の名目上の型を返します。

Modifiers

基になるメンバーのアクセス修飾子を返します。

Name

解読されたメソッド ハンドルの基になるメンバーの名前を返します。

PeerReference

ラップされたJava オブジェクト インスタンスのJniObjectReferenceを返します。

(継承元 IJavaPeerable)
ReferenceKind

割り込まれたメソッド ハンドルの参照の種類を返します。メソッド ハンドルの基になるメンバーがコンストラクター、メソッド、またはフィールドであったかどうかを判断します。

メソッド

名前 説明
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)

シンボリック参照の 4 つの部分を指定して、 MethodHandleInfoの文字列形式を返します。

UnregisterFromRuntime()

ランタイムが将来の Java.Interop.JniRuntime+JniValueManager.PeekValue 呼び出しから返されないように、このインスタンスの登録を解除します。

(継承元 IJavaPeerable)

拡張メソッド

名前 説明
GetJniTypeName(IJavaPeerable)

インスタンス selfの型の JNI 名を取得します。

JavaAs<TResult>(IJavaPeerable)

selfを強制的にTResult入力し、強制型がJava側で有効であることを確認します。

JavaCast<TResult>(IJavaObject)

Android ランタイムチェック型変換を実行します。

JavaCast<TResult>(IJavaObject)

ダイレクト メソッド ハンドルをそのコンシット記号部分に割り込むことで得られるシンボリック参照。

TryJavaCast<TResult>(IJavaPeerable, TResult)

selfを強制的にTResult入力し、強制型がJava側で有効であることを確認します。

適用対象