Linguaggio

Proxy Classe

Definizione

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.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 un'interfaccia Foo:

InvocationHandler handler = new MyInvocationHandler(...);
                Class&lt;?&gt; 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&lt;?&gt;[] { Foo.class },
                                                     handler);

Una classe proxy dinamica (detta semplicemente classe proxy 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 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 al 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 pubbliche, finali e non astratte</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 tuttavia essere 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, il pacchetto di una classe proxy non è specificato. Si noti che la chiusura del pacchetto non impedirà la corretta definizione di una classe proxy in un determinato pacchetto in fase di esecuzione e nessuna delle due classi già definite dallo stesso caricatore di classi e dallo stesso pacchetto con i 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 durante la creazione), richiamando getMethods sul relativo Class oggetto verrà restituita 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 quella delle classi di sistema caricate dal caricatore di classi 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 proxy. Invece di dover usare l'API reflection per accedere al costruttore pubblico, è anche possibile creare un'istanza proxy chiamando il Proxy#newProxyInstance Proxy.newProxyInstance metodo , che combina le azioni di chiamata Proxy#getProxyClass Proxy.getProxyClass con la chiamata 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 Fooproxy , l'espressione seguente restituirà true:

{@code proxy instanceof Foo}

e l'operazione di cast seguente avrà esito positivo (anziché generare un ' ClassCastException):

{@code (Foo) proxy}

<li>Ogni istanza 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 proxy verrà codificata e inviata al metodo del InvocationHandler#invoke invoke gestore chiamate, come descritto nella documentazione per tale metodo.

<li>Una chiamata dei hashCodemetodi , equalso 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 un metodo duplicato di questo tipo viene richiamato in un'istanza proxy, l'oggetto Method passato al gestore chiamate non sarà necessariamente quello la cui classe dichiarante è 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 quale interfaccia è stata richiamata. Pertanto, quando un metodo duplicato viene richiamato in un'istanza proxy, l'oggetto Method per il metodo nell'interfaccia principale che contiene il metodo (direttamente o ereditato tramite una superinterface) nell'elenco di interfacce della classe proxy viene passato al metodo del invoke gestore chiamate, indipendentemente dal tipo di riferimento tramite cui si è verificata la chiamata al metodo della classe proxy.

Se un'interfaccia proxy contiene un metodo con lo stesso nome e la firma dei parametri dei hashCodemetodi , equalso toString di java.lang.Object, quando tale metodo viene richiamato in un'istanza proxy, l'oggetto Method passato al gestore chiamate avrà java.lang.Object come classe dichiarante. In altre parole, i metodi pubblici 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 che sono assegnabili a uno dei tipi di eccezione nella throws clausola del metodo in tutte le interfacce proxy che può essere richiamata tramite. Se il invoke metodo genera un'eccezione controllata che non è assegnabile a uno dei tipi di eccezione dichiarati dal metodo in una delle interfacce proxy che può essere richiamata, verrà generata una chiamata deselezionata UndeclaredThrowableException nell'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.

per java.lang.reflect.Proxy.

Le parti di questa pagina sono modifiche basate sul lavoro creato e condiviso dalla e usati in base ai termini descritti in Creative License 2.5 Attribution License.

Costruttori

Nome Descrizione
Proxy(IInvocationHandler)

Costruisce una nuova Proxy istanza da una sottoclasse (in genere una classe proxy dinamica) con il valore specificato per il gestore chiamate.

Proxy(IntPtr, JniHandleOwnership)

Costruttore usato durante la creazione di rappresentazioni gestite di oggetti JNI; chiamato dal runtime.

Proprietà

Nome Descrizione
Class

Restituisce la classe di runtime di questo Objectoggetto .

(Ereditato da Object)
H

gestore chiamate per questa istanza del proxy.

Handle

Handle per l'istanza di Android sottostante.

(Ereditato da Object)
JniIdentityHashCode

Ottiene il codice hash di identità assegnato a questo Java peer dal runtime di interoperabilità.

(Ereditato da Object)
JniManagedPeerState

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.

(Ereditato da JavaObject)
JniPeerMembers

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.

PeerReference

Ottiene il riferimento all'oggetto JNI per questo peer Java.

(Ereditato da Object)
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

Nome Descrizione
Clone()

Crea e restituisce una copia di questo oggetto.

(Ereditato da Object)
Construct(JniObjectReference, JniObjectReferenceOptions)

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.

(Ereditato da JavaObject)
Dispose()

Rilascia le risorse contenute in questo peer Java.

(Ereditato da Object)
Dispose(Boolean)

Rilascia le risorse contenute in questo peer Java.

(Ereditato da Object)
DisposeUnlessReferenced()

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.

(Ereditato da JavaObject)
Equals(Object)

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.

(Ereditato da JavaObject)
Equals(Object)

Indica se un altro oggetto è "uguale a" questo.

(Ereditato da Object)
GetHashCode()

Restituisce un valore di 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 per una classe proxy in base a java.lang.Class un caricatore di classi e a una matrice di interfacce.

IsProxyClass(Class)

Restituisce true se e solo se la classe specificata è stata generata dinamicamente come classe proxy usando il getProxyClass metodo o il newProxyInstance metodo .

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 monitor dell'oggetto.

(Ereditato da Object)
SetHandle(IntPtr, JniHandleOwnership)

Imposta la proprietà Handle.

(Ereditato da Object)
SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

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.

(Ereditato da JavaObject)
ToArray<T>()

Crea una matrice gestita da questo wrapper di matrice Java.

(Ereditato da Object)
ToString()

Restituisce una rappresentazione di stringa dell'oggetto .

(Ereditato da Object)
UnregisterFromRuntime()

Annulla la registrazione di questo Java peer dal runtime di interoperabilità.

(Ereditato da Object)
Wait()

Fa sì che il thread corrente attenda finché non viene risvegliato, in genere ricevendo <>una notifica</em> o <em>interrotto</em>.

(Ereditato da Object)
Wait(Int64, Int32)

Fa sì che il thread corrente attenda finché non viene risvegliato, in genere ricevendo<> una notifica</em> o <em>interrotto</em> o fino a quando non è trascorsa una determinata quantità di tempo reale.

(Ereditato da Object)
Wait(Int64)

Fa sì che il thread corrente attenda finché non viene risvegliato, in genere ricevendo<> una notifica</em> o <em>interrotto</em> o fino a quando non è trascorsa una determinata quantità di tempo reale.

(Ereditato da Object)

Implementazioni dell'interfaccia esplicita

Nome Descrizione
IJavaPeerable.Disposed()

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.

(Ereditato da JavaObject)
IJavaPeerable.Finalized()

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.

(Ereditato da JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

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.

(Ereditato da JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

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.

(Ereditato da JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

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.

(Ereditato da JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

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.

(Ereditato da JavaObject)
IJavaPeerable.UnregisterFromRuntime()

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.

Metodi di estensione

Nome Descrizione
GetJniTypeName(IJavaPeerable)

Ottiene il nome JNI del tipo dell'istanza selfdi .

JavaAs<TResult>(IJavaPeerable)

Provare a digitare selfTResult, verificando che la coercizione sia valida sul lato Java.

JavaCast<TResult>(IJavaObject)

Esegue una conversione del tipo di tipo controllato dal runtime Android.

JavaCast<TResult>(IJavaObject)

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.

TryJavaCast<TResult>(IJavaPeerable, TResult)

Provare a digitare selfTResult, verificando che la coercizione sia valida sul lato Java.

Si applica a