Proxy クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
Proxy は、動的プロキシ クラスとインスタンスを作成するための静的メソッドを提供します。また、これらのメソッドによって作成されるすべての動的プロキシ クラスのスーパークラスでもあります。
[Android.Runtime.Register("java/lang/reflect/Proxy", DoNotGenerateAcw=true)]
public class Proxy : Java.Lang.Object, IDisposable, Java.IO.ISerializable
[<Android.Runtime.Register("java/lang/reflect/Proxy", DoNotGenerateAcw=true)>]
type Proxy = class
inherit Object
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- 継承
- 属性
- 実装
注釈
Proxy は、動的プロキシ クラスとインスタンスを作成するための静的メソッドを提供します。また、これらのメソッドによって作成されるすべての動的プロキシ クラスのスーパークラスでもあります。
インターフェイス Fooのプロキシを作成するには:
InvocationHandler handler = new MyInvocationHandler(...);
Class<?> proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), Foo.class);
Foo f = (Foo) proxyClass.getConstructor(InvocationHandler.class).
newInstance(handler);
またはより単純に:
Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
new Class<?>[] { Foo.class },
handler);
動的プロキシ クラス (単に以下のプロキシ クラスと呼ばれます) は、クラスの作成時に実行時に指定されたインターフェイスの一覧を実装するクラスで、次に説明するように動作します。
プロキシ インターフェイスは、プロキシ クラスによって実装されるインターフェイスです。
プロキシ インスタンスは、プロキシ クラスのインスタンスです。
各プロキシ インスタンスには、インターフェイス を実装するInvocationHandler オブジェクトが関連付けられています。 プロキシ インターフェイスのいずれかを介したプロキシ インスタンスのメソッド呼び出しは、インスタンスの呼び出しハンドラーの InvocationHandler#invoke invoke メソッドにディスパッチされ、プロキシ インスタンス、呼び出されたメソッドを識別する java.lang.reflect.Method オブジェクト、および引数を含む Object 型の配列が渡されます。 呼び出しハンドラーは、必要に応じてエンコードされたメソッド呼び出しを処理し、返される結果は、プロキシ インスタンスでのメソッド呼び出しの結果として返されます。
プロキシ クラスには、次のプロパティがあります。
<ul><li>Proxy クラスは、すべてのプロキシ インターフェイスが public である場合、 <em>public、final、および abstract</em> ではありません</li>
<li>Proxy クラスは、 <em>non-public、final、および抽象ではなく</em> プロキシ インターフェイスのいずれかが非 public である場合です</li>
<li>プロキシ クラスの非修飾名は指定されていません。 ただし、文字列 "$Proxy" で始まるクラス名のスペースは、プロキシ クラス用に予約する必要があります。
<li>プロキシ クラスは java.lang.reflect.Proxyを拡張します。
<li>A プロキシ クラスは、作成時に指定されたインターフェイスを同じ順序で正確に実装します。
<li>プロキシ クラスが非パブリック インターフェイスを実装する場合は、そのインターフェイスと同じパッケージで定義されます。 それ以外の場合、プロキシ クラスのパッケージも指定されていません。 パッケージのシールでは、実行時にプロキシ クラスが特定のパッケージで正常に定義されるのを防ぐものではありません。また、同じクラス ローダーと特定の署名者と同じパッケージによって既に定義されているクラスも存在しないことに注意してください。
<li>プロキシクラスは作成時に指定されたすべてのインターフェイスを実装し、そのgetInterfacesオブジェクトでClassを呼び出すと、同じインターフェイスのリスト (作成時に指定された順序で) を含む配列が返され、そのgetMethodsオブジェクトでClassを呼び出すと、それらのインターフェイス内のすべてのメソッドを含むMethodオブジェクトの配列が返され、getMethod呼び出すと、期待どおりにプロキシ インターフェイス内のメソッドが検索されます。
<li>Proxy#isProxyClass Proxy.isProxyClass メソッドは、プロキシ クラスが渡された場合は true を返します。つまり、Proxy.getProxyClassによって返されるクラス、または Proxy.newProxyInstance によって返されるオブジェクトのクラス。それ以外の場合は false が返されます。
<li>プロキシ クラスの java.security.ProtectionDomain は、プロキシ クラスのコードが信頼されたシステム コードによって生成されるため、 java.lang.Objectなどのブートストラップ クラス ローダーによって読み込まれるシステム クラスのと同じです。 通常、この保護ドメインには java.security.AllPermissionが付与されます。
<li>Each プロキシ クラスには、プロキシ インスタンスの呼び出しハンドラーを設定するための 1 つの引数 (インターフェイス InvocationHandlerの実装) を受け取る 1 つのパブリック コンストラクターがあります。 リフレクション API を使用してパブリック コンストラクターにアクセスする代わりに、 Proxy#newProxyInstance Proxy.newProxyInstance メソッドを呼び出すことによってプロキシ インスタンスを作成することもできます。このメソッドは、 Proxy#getProxyClass Proxy.getProxyClass 呼び出しのアクションと、呼び出しハンドラーを使用したコンストラクターの呼び出しを組み合わせたものです。
</ul>
プロキシ インスタンスには、次のプロパティがあります。
<ul><li>プロキシ インスタンス proxy とプロキシ クラス Fooによって実装されたインターフェイスの 1 つを使用すると、次の式は true を返します。
{@code proxy instanceof Foo}
次のキャスト操作は成功します ( ClassCastExceptionをスローするのではなく)。
{@code (Foo) proxy}
<li>Each プロキシ インスタンスには、コンストラクターに渡された呼び出しハンドラーが関連付けられています。 静的 Proxy#getInvocationHandler Proxy.getInvocationHandler メソッドは、引数として渡されたプロキシ インスタンスに関連付けられている呼び出しハンドラーを返します。
<li>プロキシ インスタンスでのインターフェイス メソッドの呼び出しは、そのメソッドのドキュメントで説明されているように、エンコードされ、呼び出しハンドラーの InvocationHandler#invoke invoke メソッドにディスパッチされます。
<li>プロキシ インスタンス上のhashCodeで宣言されたequals、toString、またはjava.lang.Objectメソッドの呼び出しは、前述のように、インターフェイス メソッドの呼び出しがエンコードおよびディスパッチされるのと同じ方法で、呼び出しハンドラーのinvoke メソッドにエンコードおよびディスパッチされます。
Methodに渡されるinvoke オブジェクトの宣言クラスがjava.lang.Objectされます。
java.lang.Objectから継承されたプロキシ インスタンスの他のパブリック メソッドはプロキシ クラスによってオーバーライドされないため、これらのメソッドの呼び出しは、java.lang.Objectのインスタンスの場合と同様に動作します。
</ul>
<h3>複数のプロキシ インターフェイスで重複するメソッド</h3>
プロキシ クラスの 2 つ以上のインターフェイスに同じ名前とパラメーター シグネチャを持つメソッドが含まれている場合、プロキシ クラスのインターフェイスの順序が重要になります。 このような 重複するメソッド がプロキシ インスタンスで呼び出されると、呼び出しハンドラーに渡される Method オブジェクトが、プロキシのメソッドが呼び出されたインターフェイスの参照型から宣言クラスが割り当て可能であるとは限りません。 この制限は、生成されたプロキシ クラスの対応するメソッド実装が、呼び出されたインターフェイスを特定できないために存在します。 したがって、プロキシ インスタンスで重複するメソッドが呼び出されると、プロキシ クラスのインターフェイスの一覧にメソッド (直接またはスーパーインターフェイスを介して継承される) を含む、最も重要なインターフェイス内のメソッドの Method オブジェクトは、メソッド呼び出しが発生した参照型に関係なく、呼び出しハンドラーの invoke メソッドに渡されます。
プロキシ インターフェイスに、hashCodeのequals、toString、またはjava.lang.Objectメソッドと同じ名前とパラメーター シグネチャを持つメソッドが含まれている場合、プロキシ インスタンスでこのようなメソッドが呼び出されると、呼び出しハンドラーに渡されるMethod オブジェクトは、宣言クラスとしてjava.lang.Objectされます。 つまり、呼び出しハンドラーに渡すオブジェクトjava.lang.Object決定するために、Methodのパブリックで最終的でないメソッドが論理的にすべてのプロキシ インターフェイスの前に置きます。
また、重複するメソッドが呼び出しハンドラーにディスパッチされる場合、invoke メソッドは、呼び出すことができるthrowsプロキシ インターフェイスで、メソッドの 句内のいずれかの例外型に割り当て可能なチェック済みの例外型のみをスローできることに注意してください。
invoke メソッドが、呼び出すことができるプロキシ インターフェイスのいずれかでメソッドによって宣言された例外の種類に割り当てられないチェックされた例外をスローした場合、プロキシ インスタンスの呼び出しによってオフのUndeclaredThrowableExceptionがスローされます。 この制限は、getExceptionTypes メソッドに渡されたMethod オブジェクトに対してinvokeを呼び出すことによって返されるすべての例外の種類が、必ずしも invoke メソッドによって正常にスローされるわけではないことを意味します。
1.3 で追加されました。
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。
コンストラクター
| 名前 | 説明 |
|---|---|
| Proxy(IInvocationHandler) |
呼び出しハンドラーの指定した値を持つサブクラス (通常は動的プロキシ クラス) から新しい |
| Proxy(IntPtr, JniHandleOwnership) |
JNI オブジェクトのマネージド表現を作成するときに使用されるコンストラクター。ランタイムによって呼び出されます。 |
プロパティ
| 名前 | 説明 |
|---|---|
| Class |
この |
| H |
このプロキシ インスタンスの呼び出しハンドラー。 |
| Handle |
基になる Android インスタンスへのハンドル。 (継承元 Object) |
| JniIdentityHashCode |
相互運用ランタイムによってこのJava ピアに割り当てられた ID ハッシュ コードを取得します。 (継承元 Object) |
| JniManagedPeerState |
|
| JniPeerMembers |
|
| PeerReference |
このJava ピアの JNI オブジェクト参照を取得します。 (継承元 Object) |
| ThresholdClass |
この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。 |
| ThresholdType |
この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。 |
メソッド
| 名前 | 説明 |
|---|---|
| Clone() |
このオブジェクトのコピーを作成して返します。 (継承元 Object) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
|
| Dispose() |
このJava ピアによって保持されているリソースを解放します。 (継承元 Object) |
| Dispose(Boolean) |
このJava ピアによって保持されているリソースを解放します。 (継承元 Object) |
| DisposeUnlessReferenced() |
|
| Equals(Object) |
|
| Equals(Object) |
他のオブジェクトがこのオブジェクトと "等しい" かどうかを示します。 (継承元 Object) |
| GetHashCode() |
オブジェクトのハッシュ コード値を返します。 (継承元 Object) |
| GetInvocationHandler(Object) |
指定したプロキシ インスタンスの呼び出しハンドラーを返します。 |
| GetProxyClass(ClassLoader, Class[]) |
クラス ローダーとインターフェイスの配列を指定して、プロキシ クラスの |
| IsProxyClass(Class) |
|
| JavaFinalize() |
古い.
オブジェクトへの参照がなくなったとガベージ コレクションによって判断されたときに、オブジェクトのガベージ コレクターによって呼び出されます。 (継承元 Object) |
| NewProxyInstance(ClassLoader, Class[], IInvocationHandler) |
メソッド呼び出しを指定した呼び出しハンドラーにディスパッチする、指定したインターフェイスのプロキシ クラスのインスタンスを返します。 |
| Notify() |
このオブジェクトのモニターで待機している 1 つのスレッドを起動します。 (継承元 Object) |
| NotifyAll() |
このオブジェクトのモニターで待機しているすべてのスレッドを起動します。 (継承元 Object) |
| SetHandle(IntPtr, JniHandleOwnership) |
Handle プロパティを設定します。 (継承元 Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
|
| ToArray<T>() |
このJava配列ラッパーからマネージド配列を作成します。 (継承元 Object) |
| ToString() |
オブジェクトの文字列形式を返します。 (継承元 Object) |
| UnregisterFromRuntime() |
相互運用ランタイムからこのJava ピアの登録を解除します。 (継承元 Object) |
| Wait() |
現在のスレッドが起動するまで待機します。通常は、 <em>notified</em> または <em>interrupted</em>。 (継承元 Object) |
| Wait(Int64, Int32) |
現在のスレッドは、通常、 <em>notified</em> または <em>interrupted</em>、または一定のリアルタイムが経過するまで、起動されるまで待機します。 (継承元 Object) |
| Wait(Int64) |
現在のスレッドは、通常、 <em>notified</em> または <em>interrupted</em>、または一定のリアルタイムが経過するまで、起動されるまで待機します。 (継承元 Object) |
明示的なインターフェイスの実装
| 名前 | 説明 |
|---|---|
| IJavaPeerable.Disposed() |
|
| IJavaPeerable.Finalized() |
|
| IJavaPeerable.JniObjectReferenceControlBlock |
|
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
|
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
|
| IJavaPeerable.SetPeerReference(JniObjectReference) |
|
| IJavaPeerable.UnregisterFromRuntime() |
|
拡張メソッド
| 名前 | 説明 |
|---|---|
| GetJniTypeName(IJavaPeerable) |
インスタンス |
| JavaAs<TResult>(IJavaPeerable) |
|
| JavaCast<TResult>(IJavaObject) |
Android ランタイムチェック型変換を実行します。 |
| JavaCast<TResult>(IJavaObject) |
|
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
|