Proxy 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
Proxy
提供靜態方法來建立動態 Proxy 類別和實例,也是這些方法所建立之所有動態 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
提供靜態方法來建立動態 Proxy 類別和實例,也是這些方法所建立之所有動態 Proxy 類別的超類別。
若要為某些介面 Foo
建立 Proxy:
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);
動態 Proxy 類別 (只稱為下列 proxy類別) 是類別,可在建立類別時實作執行時間所指定的介面清單,其行為如下所述。
Proxy 介面是 Proxy 類別所實作的介面。
Proxy 實例是 Proxy 類別的實例。
每個 Proxy 實例都有相關聯的 調用處理程式 物件,它會實作 介面 InvocationHandler
。 透過其中一個 Proxy 介面在 Proxy 實例上叫用的方法調用,將會分派至 InvocationHandler#invoke invoke
實例調用處理程式的 方法、傳遞 Proxy 實例、 java.lang.reflect.Method
識別叫用方法的物件,以及包含引數的 型 Object
別陣列。 調用處理程式會適當地處理編碼的方法調用,並傳回的結果會傳回為 Proxy 實例上方法調用的結果。
Proxy 類別具有下列屬性:
<ul > li Proxy 類別是 < em > public、final,如果所有 Proxy 介面都是 public,則不是 abstract < /em > 。 <></李>
<li > Proxy 類別是 < em > 非公用、final,如果任何 Proxy 介面為非公用,則為 abstract < /em > 。 </李>
<li > 未指定 Proxy 類別的非限定名稱。 不過,以字串 "$Proxy"
開頭的類別名稱空間應該保留給 Proxy 類別。
<li > Proxy 類別會 java.lang.reflect.Proxy
擴充 。
<li > Proxy 類別會依照相同的順序,實作在建立時所指定的介面。
<li > 如果 Proxy 類別實作非公用介面,則會在與該介面相同的套件中定義。 否則,Proxy 類別的封裝也未指定。 請注意,封裝密封不會防止 Proxy 類別在執行時間成功定義于特定套件中,而且類別都不會由相同的類別載入器和具有特定簽署者的相同套件所定義。
<li > 因為 Proxy 類別會實作在其建立時指定的所有介面,叫 getInterfaces
用物件 Class
會傳回包含相同介面清單的陣列, (在其建立時指定的順序) , getMethods
叫用其 Class
物件會傳回包含這些介面中所有方法的物件陣列 Method
。 和 叫用 getMethod
會在 Proxy 介面中找到如預期般的方法。
<li > 如果 Proxy#isProxyClass Proxy.isProxyClass
方法傳遞 Proxy 類別,則方法會傳回 true,也就是 所 Proxy.getProxyClass
傳回的類別,或 -- 所 Proxy.newProxyInstance
傳回物件的類別,否則傳回 false。
<java.security.ProtectionDomain
li > Proxy 類別的 與啟動程式類別載入器所載入的系統類別相同,例如 java.lang.Object
,因為 Proxy 類別的程式碼是由受信任的系統程式碼所產生。 此保護網域通常會被授與 java.security.AllPermission
。
<li > 每個 Proxy 類別都有一個公用建構函式,其採用介面 的 InvocationHandler
實作一個引數,以設定 Proxy 實例的調用處理程式。 除了必須使用反映 API 來存取公用建構函式,您也可以呼叫 Proxy#newProxyInstance Proxy.newProxyInstance
方法來建立 Proxy 實例,此方法結合了呼叫 Proxy#getProxyClass Proxy.getProxyClass
的動作與叫用建構函式與叫用處理程式。 </ul>
Proxy 實例具有下列屬性:
<ul >< li > 指定 Proxy 實例 proxy
及其 Proxy 類別 Foo
所實作的其中一個介面,下列運算式會傳回 true:
{@code proxy instanceof Foo}
和下列轉換作業將會成功 (,而不是擲回 ClassCastException
) :
{@code (Foo) proxy}
<li > 每個 Proxy 實例都有相關聯的調用處理程式,這是傳遞給其建構函式的處理常式。 靜態 Proxy#getInvocationHandler Proxy.getInvocationHandler
方法會傳回與做為其引數傳遞之 Proxy 實例相關聯的調用處理程式。
<li > Proxy 實例上的介面方法調用會編碼並分派至調用處理程式的 InvocationHandler#invoke invoke
方法,如該方法的檔中所述。
<li > 在 Proxy 實例上宣告 java.lang.Object
之 hashCode
、 equals
或 toString
方法的叫用,將會以與介面方法調用編碼和分派的方式,以編碼和分派給調用處理程式 invoke
的 方法,如上所述。 傳遞至 invoke
之 Method
物件的宣告類別將會是 java.lang.Object
。 Proxy 類別不會覆寫繼承自 java.lang.Object
之 Proxy 實例的其他公用方法,因此這些方法的叫用行為就像對 實例 java.lang.Object
所做的一樣。 </ul>
<多個 Proxy 介面 < /h3 中重複的 h3 > 方法>
當 Proxy 類別的兩個或多個介面包含具有相同名稱和參數簽章的方法時,Proxy 類別的介面順序會變得相當重要。 在 Proxy 實例上叫用這類 重複的方法 時, Method
傳遞至調用處理程式的物件不一定是可從叫用 Proxy 方法之介面的參考型別指派的物件。 這項限制存在,因為產生的 Proxy 類別中的對應方法實作無法判斷它透過哪一個介面叫用。 因此,在 Proxy 實例上叫用重複的方法時, Method
在最重要介面中包含方法 (方法的物件會直接或透過 Proxy 類別的介面清單) 繼承至調用處理程式 invoke
的 方法,不論方法叫用發生所在的參考型別為何。
如果在 Proxy 實例上叫用這類方法時,Proxy 介面包含與 、 equals
或 方法相同的名稱和參數簽章 hashCode
的方法 java.lang.Object
, Method
則傳遞至調用處理程式的物件將具有 java.lang.Object
做為其宣告 toString
類別。 換句話說,邏輯上所有 Proxy 介面的公用非最終方法 java.lang.Object
,用於判斷要傳遞至調用處理程式的物件 Method
。
另請注意,當重複的方法分派至調用處理程式時, invoke
方法可能只會擲回可指派給方法子句中 throws
方法 之一例外狀況類型的已檢查例外狀況類型,這些例外狀況類型可透過叫用。 invoke
如果方法擲回無法指派給方法所宣告的任何例外狀況類型的已核取例外狀況,方法可在其中一個 Proxy 介面中叫用該例外狀況,則 Proxy 實例上的叫用將會擲回未核取 UndeclaredThrowableException
的例外狀況。 這項限制表示,在傳遞給 invoke
方法的物件 Method
上叫 getExceptionTypes
用 所傳回的所有例外狀況類型不一定會由 invoke
方法成功擲回。
已在 1.3 中新增。
的 java.lang.reflect.Proxy
JAVA 檔。
此頁面的部分是根據所建立和共用的工作進行修改,並根據 2.5 屬性授權中所述的詞彙來使用。
建構函式
Proxy(IInvocationHandler) |
從子類別 (建構新的 |
Proxy(IntPtr, JniHandleOwnership) |
建立 JNI 物件的 Managed 標記法時使用的建構函式;由執行時間呼叫。 |
屬性
Class |
傳回這個 |
H |
這個 Proxy 實例的調用處理程式。 |
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) |
傳回指定 Proxy 實例的調用處理程式。 |
GetProxyClass(ClassLoader, Class[]) |
|
IsProxyClass(Class) |
只有在指定的類別是使用 |
JavaFinalize() |
當垃圾收集判斷物件不再參考物件時,垃圾收集行程會在物件上呼叫。 (繼承來源 Object) |
NewProxyInstance(ClassLoader, Class[], IInvocationHandler) |
針對將方法調用分派至指定調用處理程式的指定介面,傳回 Proxy 類別的實例。 |
Notify() |
喚醒正在等候此物件監視器的單一線程。 (繼承來源 Object) |
NotifyAll() |
喚醒正在等候此物件監視器的所有線程。 (繼承來源 Object) |
SetHandle(IntPtr, JniHandleOwnership) |
設定 Handle 屬性。 (繼承來源 Object) |
ToArray<T>() |
|
ToString() |
傳回物件的字串表示。 (繼承來源 Object) |
UnregisterFromRuntime() |
|
Wait() |
讓目前的執行緒等到喚醒為止,通常是 em < notified/em > 或 < em > interrupted < /em > 。 >< (繼承來源 Object) |
Wait(Int64) |
讓目前的執行緒等到喚醒為止,通常是 em < notified/em > 或 < em > interrupted < /em > ,或直到經過一定數量的即時為止。 <> (繼承來源 Object) |
Wait(Int64, Int32) |
讓目前的執行緒等到喚醒為止,通常是 em < notified/em > 或 < em > interrupted < /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) |
|