Proxy クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
Proxy
は、動的プロキシ クラスとインスタンスを作成するための静的メソッドを提供します。また、これらのメソッドによって作成されるすべての動的プロキシ クラスのスーパークラスでもあります。
[Android.Runtime.Register("java/lang/reflect/Proxy", DoNotGenerateAcw=true)]
public class Proxy : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, 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 クラスは、すべてのプロキシ インターフェイスが <パブリックである場合、em>public、final、abstract</em> ではありません。</李>
<li>プロキシ クラスは <>em 非パブリック、最終、およびプロキシ インターフェイスのいずれかが非パブリックの場合は abstract</em> ではありません。</李>
<li>プロキシ クラスの非修飾名が指定されていません。 ただし、文字列 "$Proxy"
で始まるクラス名のスペースは、プロキシ クラス用に予約されている必要があります。
<li>プロキシ クラスは を拡張します java.lang.reflect.Proxy
。
<li>プロキシ クラスは、作成時に指定されたインターフェイスを同じ順序で正確に実装します。
<li>プロキシ クラスが非パブリック インターフェイスを実装する場合は、そのインターフェイスと同じパッケージで定義されます。 それ以外の場合、プロキシ クラスのパッケージも指定されません。 パッケージのシーリングでは、実行時にプロキシ クラスが特定のパッケージで正常に定義されるのを防ぐことはなく、同じクラス ローダーと特定の署名者を持つ同じパッケージによって既に定義されているクラスも発生しないことに注意してください。
<li>プロキシ クラスは作成時に指定されたすべてのインターフェイスを実装するため、そのClass
オブジェクトで をgetInterfaces
呼び出すと、同じインターフェイスのリスト (作成時に指定された順序で) を含む配列が返されます。そのClass
オブジェクトで をgetMethods
呼び出すと、それらのインターフェイス内のすべてのメソッドを含むオブジェクトのMethod
配列が返され、呼び出getMethod
すと予想どおりにプロキシ インターフェイス内のメソッドが検索されます。
<li>メソッドはProxy#isProxyClass Proxy.isProxyClass
、プロキシ クラスが渡された場合は true を返します。つまり、 によって返されるクラス、または によってProxy.getProxyClass
Proxy.newProxyInstance
返されるオブジェクトのクラス、それ以外の場合は false を返します。
<li>プロキシ クラスの は java.security.ProtectionDomain
、 などの java.lang.Object
ブートストラップ クラス ローダーによって読み込まれたシステム クラスのコードと同じです。これは、プロキシ クラスのコードが信頼できるシステム コードによって生成されるためです。 通常、この保護ドメインには が付与 java.security.AllPermission
されます。
<li>各プロキシ クラスには、1 つの引数を受け取る 1 つのパブリック コンストラクター (インターフェイス InvocationHandler
の実装) があり、プロキシ インスタンスの呼び出しハンドラーを設定します。 リフレクション 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>各プロキシ インスタンスには、コンストラクターに渡された呼び出しハンドラーが関連付けられています。 静的 Proxy#getInvocationHandler Proxy.getInvocationHandler
メソッドは、引数として渡されたプロキシ インスタンスに関連付けられている呼び出しハンドラーを返します。
<li>プロキシ インスタンスでのインターフェイス メソッドの呼び出しは、そのメソッドのドキュメントで説明されているように、呼び出しハンドラーの InvocationHandler#invoke invoke
メソッドにエンコードされ、ディスパッチされます。
<li>プロキシ インスタンスで でjava.lang.Object
宣言された 、equals
、または toString
メソッドのhashCode
呼び出しは、前述のように、インターフェイス メソッドの呼び出しがエンコードおよびディスパッチされるのと同じ方法で、呼び出しハンドラーのinvoke
メソッドにエンコードおよびディスパッチされます。 に渡されるオブジェクトのMethod
宣言クラスは になりますjava.lang.Object
。invoke
から java.lang.Object
継承されたプロキシ インスタンスの他のパブリック メソッドはプロキシ クラスによってオーバーライドされないため、これらのメソッドの呼び出しは、 の java.lang.Object
インスタンスの場合と同様に動作します。 </ul>
<複数のプロキシ インターフェイス<で重複する h3>メソッド/h3>
プロキシ クラスの 2 つ以上のインターフェイスに同じ名前とパラメーター シグネチャを持つメソッドが含まれている場合、プロキシ クラスのインターフェイスの順序が重要になります。 このような重複する メソッド がプロキシ インスタンスで呼び出されると、 Method
呼び出しハンドラーに渡されるオブジェクトが、プロキシのメソッドが呼び出されたインターフェイスの参照型から宣言クラスが割り当て可能であるとは限りません。 この制限は、生成されたプロキシ クラスの対応するメソッド実装が、呼び出されたインターフェイスを特定できないために存在します。 したがって、プロキシ インスタンスで重複するメソッドが呼び出されると、 Method
プロキシ クラスのインターフェイスの一覧にメソッド (直接またはスーパーインターフェイスを介して継承される) を含む最も重要なインターフェイスのメソッドの オブジェクトは、メソッド呼び出しが発生した参照型に関係なく、呼び出しハンドラーの invoke
メソッドに渡されます。
プロキシ インターフェイスに、 の 、、または メソッドと同じ名前とパラメーター シグネチャhashCode
equals
を持つメソッドjava.lang.Object
が含まれている場合、そのようなメソッドがプロキシ インスタンスで呼び出されると、Method
呼び出しハンドラーに渡されるオブジェクトは宣言クラスとして持ちますjava.lang.Object
。toString
言い換えると、 のパブリックな非最終メソッド java.lang.Object
は、呼び出しハンドラーに渡す Method
オブジェクトを決定するために、すべてのプロキシ インターフェイスの前に論理的に先行します。
また、重複するメソッドが呼び出しハンドラーにディスパッチされる場合、メソッドは、invoke
呼び出すことができるすべてのプロキシ インターフェイスの メソッドの 句でthrows
、いずれかの例外型に割り当て可能なチェック済みの例外型のみをスローする場合があることに注意してください。 メソッドが invoke
、呼び出すことができるプロキシ インターフェイスのいずれかで メソッドによって宣言された例外の種類に割り当てられないチェックされた例外をスローした場合は、プロキシ インスタンスの呼び出しによってオフ UndeclaredThrowableException
がスローされます。 この制限は、メソッドに渡されたオブジェクトで をgetExceptionTypes
Method
呼び出すことによって返されるinvoke
例外の種類のすべてが、 メソッドによって必ずしも正常にスローされるとは限らないことをinvoke
意味します。
1.3 で追加されました。
の Java ドキュメント java.lang.reflect.Proxy
。
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。
コンストラクター
Proxy(IInvocationHandler) |
呼び出しハンドラーに指定された値を持つサブクラス (通常は動的プロキシ クラス) から新しい |
Proxy(IntPtr, JniHandleOwnership) |
JNI オブジェクトのマネージド表現を作成するときに使用されるコンストラクター。ランタイムによって呼び出されます。 |
プロパティ
Class |
この |
H |
このプロキシ インスタンスの呼び出しハンドラー。 |
Handle |
基になる Android インスタンスへのハンドル。 (継承元 Object) |
JniIdentityHashCode |
|
JniPeerMembers |
|
PeerReference |
|
ThresholdClass |
この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用することを意図したものではありません。 |
ThresholdType |
この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用することを意図したものではありません。 |
メソッド
Clone() |
このオブジェクトのコピーを作成して返します。 (継承元 Object) |
Dispose() |
|
Dispose(Boolean) |
|
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) |
ToArray<T>() |
|
ToString() |
オブジェクトの文字列形式を返します。 (継承元 Object) |
UnregisterFromRuntime() |
|
Wait() |
現在のスレッドが起動するまで待機します。通常<>は、通知</em> または <em>割り込み</em によって待機します>。 (継承元 Object) |
Wait(Int64) |
現在のスレッドが起動するまで待機します。通常<>は、通知</em> または>< em 割り込み</em>、または一定のリアルタイムが経過するまで待機します。 (継承元 Object) |
Wait(Int64, Int32) |
現在のスレッドが起動するまで待機します。通常<>は、通知</em> または>< em 割り込み</em>、または一定のリアルタイムが経過するまで待機します。 (継承元 Object) |
明示的なインターフェイスの実装
IJavaPeerable.Disposed() |
|
IJavaPeerable.DisposeUnlessReferenced() |
|
IJavaPeerable.Finalized() |
|
IJavaPeerable.JniManagedPeerState |
|
IJavaPeerable.SetJniIdentityHashCode(Int32) |
|
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
|
IJavaPeerable.SetPeerReference(JniObjectReference) |
|
拡張メソッド
JavaCast<TResult>(IJavaObject) |
Android ランタイムチェック型変換を実行します。 |
JavaCast<TResult>(IJavaObject) |
|
GetJniTypeName(IJavaPeerable) |
|