Proxy Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Proxy
fornisce metodi statici per la creazione di classi proxy dinamiche e istanze ed è anche la superclasse di tutte le classi proxy dinamiche create da tali metodi.
[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
- Ereditarietà
- Attributi
- Implementazioni
Commenti
Proxy
fornisce metodi statici per la creazione di classi proxy dinamiche e istanze ed è anche la superclasse di tutte le classi proxy dinamiche create da tali metodi.
Per creare un proxy per alcune interfacce Foo
:
InvocationHandler handler = new MyInvocationHandler(...);
Class<?> proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), Foo.class);
Foo f = (Foo) proxyClass.getConstructor(InvocationHandler.class).
newInstance(handler);
o più semplicemente:
Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
new Class<?>[] { Foo.class },
handler);
Una classe proxy dinamica (denominata semplicemente classe proxy riportata di seguito) è una classe che implementa un elenco di interfacce specificate in fase di esecuzione quando viene creata la classe, con il comportamento descritto di seguito.
Un'interfaccia proxy è un'interfaccia di questo tipo implementata da una classe proxy.
Un'istanza proxy è un'istanza di una classe proxy.
Ogni istanza del proxy ha un oggetto gestore chiamate associato, che implementa l'interfaccia InvocationHandler
. Una chiamata al metodo in un'istanza del proxy tramite una delle relative interfacce proxy verrà inviata al InvocationHandler#invoke invoke
metodo del gestore chiamate dell'istanza, passando l'istanza del proxy, un java.lang.reflect.Method
oggetto che identifica il metodo richiamato e una matrice di tipo Object
contenente gli argomenti. Il gestore chiamate elabora la chiamata del metodo codificato in base alle esigenze e il risultato restituito verrà restituito come risultato della chiamata al metodo nell'istanza del proxy.
Una classe proxy ha le proprietà seguenti:
<le classi proxy ul><li>sono <em>public, final e non abstract</em> se tutte le interfacce proxy sono pubbliche.</li>
<le classi proxy li>sono <em>non-public, final e non abstract</em> se una delle interfacce proxy è non pubblica.</li>
<li>Il nome non qualificato di una classe proxy non è specificato. Lo spazio dei nomi di classe che iniziano con la stringa "$Proxy"
deve essere, tuttavia, riservato per le classi proxy.
<li>Una classe proxy estende java.lang.reflect.Proxy
.
<li>Una classe proxy implementa esattamente le interfacce specificate al momento della creazione, nello stesso ordine.
<li>Se una classe proxy implementa un'interfaccia non pubblica, verrà definita nello stesso pacchetto di tale interfaccia. In caso contrario, anche il pacchetto di una classe proxy non è specificato. Si noti che il sealed del pacchetto non impedisce che una classe proxy venga definita correttamente in un determinato pacchetto in fase di esecuzione e nessuna delle classi già definite dallo stesso caricatore di classi e dallo stesso pacchetto con firmatari specifici.
<li>Poiché una classe proxy implementa tutte le interfacce specificate durante la creazione, richiamando getInterfaces
sul relativo Class
oggetto verrà restituita una matrice contenente lo stesso elenco di interfacce (nell'ordine specificato al momento della creazione), la chiamata getMethods
al relativo Class
oggetto restituirà una matrice di Method
oggetti che includono tutti i metodi in tali interfacce e richiamando getMethod
i metodi nelle interfacce proxy come previsto.
<li>Il Proxy#isProxyClass Proxy.isProxyClass
metodo restituirà true se viene passata una classe proxy, ovvero una classe restituita da Proxy.getProxyClass
o la classe di un oggetto restituito da Proxy.newProxyInstance
e false in caso contrario.
<li>L java.security.ProtectionDomain
di una classe proxy è uguale a quello delle classi di sistema caricate dal caricatore della classe bootstrap, ad esempio java.lang.Object
, perché il codice per una classe proxy viene generato da codice di sistema attendibile. A questo dominio di protezione verrà in genere concesso java.security.AllPermission
.
<li>Ogni classe proxy ha un costruttore pubblico che accetta un argomento, un'implementazione dell'interfaccia InvocationHandler
, per impostare il gestore chiamate per un'istanza del proxy. Invece di dover usare l'API reflection per accedere al costruttore pubblico, è possibile creare anche un'istanza del proxy chiamando il Proxy#newProxyInstance Proxy.newProxyInstance
metodo , che combina le azioni di chiamata Proxy#getProxyClass Proxy.getProxyClass
con il richiamo del costruttore con un gestore chiamate. </ul>
Un'istanza del proxy ha le proprietà seguenti:
<ul><li>Dato un'istanza proxy
proxy e una delle interfacce implementate dalla relativa classe Foo
proxy , l'espressione seguente restituirà true:
{@code proxy instanceof Foo}
e l'operazione di cast seguente avrà esito positivo (anziché generare un oggetto ClassCastException
):
{@code (Foo) proxy}
<li>Ogni istanza del proxy ha un gestore chiamate associato, quello passato al relativo costruttore. Il metodo statico Proxy#getInvocationHandler Proxy.getInvocationHandler
restituirà il gestore chiamate associato all'istanza del proxy passato come argomento.
<li>Una chiamata al metodo di interfaccia in un'istanza del proxy verrà codificata e inviata al metodo del InvocationHandler#invoke invoke
gestore chiamate, come descritto nella documentazione relativa a tale metodo.
<li>Una chiamata dei hashCode
metodi , equals
o toString
dichiarati in in java.lang.Object
un'istanza proxy verrà codificata e inviata al metodo del invoke
gestore chiamate nello stesso modo in cui le chiamate al metodo del metodo di interfaccia vengono codificate e inviate, come descritto in precedenza. La classe dichiarante dell'oggetto Method
passato a invoke
sarà java.lang.Object
. Altri metodi pubblici di un'istanza proxy ereditata da java.lang.Object
non vengono sottoposti a override da una classe proxy, pertanto le chiamate di tali metodi si comportano come per le istanze di java.lang.Object
. </ul>
<Metodi h3>duplicati in più interfacce< proxy/h3>
Quando due o più interfacce di una classe proxy contengono un metodo con lo stesso nome e la stessa firma dei parametri, l'ordine delle interfacce della classe proxy diventa significativo. Quando tale metodo duplicato viene richiamato in un'istanza del proxy, l'oggetto Method
passato al gestore chiamate non sarà necessariamente quello la cui classe dichiarativa è assegnabile dal tipo di riferimento dell'interfaccia richiamata dal metodo del proxy. Questa limitazione esiste perché l'implementazione del metodo corrispondente nella classe proxy generata non è in grado di determinare l'interfaccia richiamata tramite . Pertanto, quando viene richiamato un metodo duplicato in un'istanza del proxy, l'oggetto Method
per il metodo nell'interfaccia principale che contiene il metodo (direttamente o ereditato tramite una superinterfaccia) nell'elenco di interfacce della classe proxy viene passato al metodo del invoke
gestore chiamate, indipendentemente dal tipo di riferimento attraverso il quale si è verificata la chiamata al metodo della classe proxy.
Se un'interfaccia proxy contiene un metodo con lo stesso nome e la stessa firma di parametro dei hashCode
metodi , equals
o toString
di java.lang.Object
, quando tale metodo viene richiamato in un'istanza del proxy, l'oggetto Method
passato al gestore chiamate avrà java.lang.Object
come classe dichiarante. In altre parole, i metodi pubblici e non finali di java.lang.Object
precedono logicamente tutte le interfacce proxy per la determinazione dell'oggetto Method
da passare al gestore chiamate.
Si noti anche che quando un metodo duplicato viene inviato a un gestore chiamate, il invoke
metodo può generare solo tipi di eccezione controllati assegnabili a uno dei tipi di eccezione nella throws
clausola del metodo in tutte le interfacce proxy che è possibile richiamare tramite. Se il invoke
metodo genera un'eccezione controllata che non è assegnabile a nessuno dei tipi di eccezione dichiarati dal metodo in una delle interfacce proxy che può essere richiamata tramite, verrà generata un'eccezione deselezionata UndeclaredThrowableException
dalla chiamata sull'istanza del proxy. Questa restrizione significa che non tutti i tipi di eccezione restituiti richiamando getExceptionTypes
l'oggetto Method
passato al invoke
metodo possono necessariamente essere generati correttamente dal invoke
metodo .
Aggiunta nella versione 1.3.
Documentazione java per java.lang.reflect.Proxy
.
Le parti di questa pagina sono modifiche basate sul lavoro creato e condiviso dal Android e usato in base ai termini descritti in 2.5 Attribution License Creative Commons 2.5 Attribution License.
Costruttori
Proxy(IInvocationHandler) |
Costruisce una nuova |
Proxy(IntPtr, JniHandleOwnership) |
Costruttore utilizzato durante la creazione di rappresentazioni gestite di oggetti JNI; chiamato dal runtime. |
Proprietà
Class |
Restituisce la classe di runtime di questo |
H |
gestore chiamate per questa istanza del proxy. |
Handle |
Handle per l'istanza di Android sottostante. (Ereditato da Object) |
JniIdentityHashCode |
|
JniPeerMembers |
|
PeerReference |
|
ThresholdClass |
Questa API supporta l'infrastruttura Mono per Android e non deve essere usata direttamente dal codice. |
ThresholdType |
Questa API supporta l'infrastruttura Mono per Android e non deve essere usata direttamente dal codice. |
Metodi
Clone() |
Crea e restituisce una copia di questo oggetto. (Ereditato da Object) |
Dispose() |
|
Dispose(Boolean) |
|
Equals(Object) |
Indica se un altro oggetto è "uguale a" questo. (Ereditato da Object) |
GetHashCode() |
Restituisce un valore del codice hash per l'oggetto. (Ereditato da Object) |
GetInvocationHandler(Object) |
Restituisce il gestore chiamate per l'istanza del proxy specificata. |
GetProxyClass(ClassLoader, Class[]) |
Restituisce l'oggetto |
IsProxyClass(Class) |
Restituisce true se e solo se la classe specificata è stata generata dinamicamente come classe proxy utilizzando il |
JavaFinalize() |
Chiamato dal Garbage Collector su un oggetto quando Garbage Collection determina che non sono presenti altri riferimenti all'oggetto . (Ereditato da Object) |
NewProxyInstance(ClassLoader, Class[], IInvocationHandler) |
Restituisce un'istanza di una classe proxy per le interfacce specificate che inviano chiamate al metodo al gestore chiamate specificato. |
Notify() |
Riattiva un singolo thread in attesa del monitor dell'oggetto. (Ereditato da Object) |
NotifyAll() |
Riattiva tutti i thread in attesa del monitoraggio di questo oggetto. (Ereditato da Object) |
SetHandle(IntPtr, JniHandleOwnership) |
Imposta la proprietà Handle. (Ereditato da Object) |
ToArray<T>() |
|
ToString() |
Restituisce una rappresentazione in formato stringa dell'oggetto. (Ereditato da Object) |
UnregisterFromRuntime() |
|
Wait() |
Fa sì che il thread corrente attenda finché non viene risvegliato, in genere eseguendo <una>notifica</em> o <em>interrotto</em>. (Ereditato da Object) |
Wait(Int64) |
Fa sì che il thread corrente attenda finché non viene risvegliato, in genere eseguendo <una notifica</>em> o <em>interrotto</em> o fino a quando non è trascorsa una certa quantità di tempo reale. (Ereditato da Object) |
Wait(Int64, Int32) |
Fa sì che il thread corrente attenda finché non viene risvegliato, in genere eseguendo <una notifica</>em> o <em>interrotto</em> o fino a quando non è trascorsa una certa quantità di tempo reale. (Ereditato da Object) |
Implementazioni dell'interfaccia esplicita
IJavaPeerable.Disposed() |
|
IJavaPeerable.DisposeUnlessReferenced() |
|
IJavaPeerable.Finalized() |
|
IJavaPeerable.JniManagedPeerState |
|
IJavaPeerable.SetJniIdentityHashCode(Int32) |
|
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
|
IJavaPeerable.SetPeerReference(JniObjectReference) |
|
Metodi di estensione
JavaCast<TResult>(IJavaObject) |
Esegue una conversione del tipo verificato dal runtime Android. |
JavaCast<TResult>(IJavaObject) |
|
GetJniTypeName(IJavaPeerable) |
|