VarHandle Klasse

Definition

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

[Android.Runtime.Register("java/lang/invoke/VarHandle", ApiSince=33, DoNotGenerateAcw=true)]
public abstract class VarHandle : Java.Lang.Object
[<Android.Runtime.Register("java/lang/invoke/VarHandle", ApiSince=33, DoNotGenerateAcw=true)>]
type VarHandle = class
    inherit Object
Vererbung
VarHandle
Attribute

Hinweise

Ein VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder auf eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur. Der Zugriff auf solche Variablen wird unter verschiedenen <Zugriffsmodi></em> unterstützt, einschließlich einfachem Lese-/Schreibzugriff, flüchtigem Lese-/Schreibzugriff und Vergleichen und Festlegen.

VarHandles sind unveränderlich und weisen keinen sichtbaren Zustand auf. VarHandles kann vom Benutzer nicht unterklassiert werden.

Ein VarHandle hat: <ul><li>a #varType variable type T, den Typ jeder Variablen, auf die von diesem VarHandle verwiesen wird; und <li>eine Liste von #coordinateTypes coordinate typesCT1, CT2, ..., CTn, die Typen von <em-Koordinatenausdrücken></em>, die gemeinsam eine Variable suchen, auf die von diesem VarHandle verwiesen wird. </ul> Variablen- und Koordinatentypen können primitiv oder referenziert sein und durch Class -Objekte dargestellt werden. Die Liste der Koordinatentypen kann leer sein.

Factorymethoden, die oder java.lang.invoke.MethodHandles.Lookup lookup VarHandle-Instanzen erzeugen, dokumentieren den unterstützten Variablentyp und die Liste der Koordinatentypen.

Jeder Zugriffsmodus ist einer <methode/em> des Zugriffsmodus< zugeordnet, einer polymorphen Signaturmethode namens für>den Zugriffsmodus. Wenn eine Zugriffsmodusmethode für eine VarHandle-instance aufgerufen wird, sind die anfänglichen Argumente für den Aufruf Koordinatenausdrücke, die genau angeben, auf welches Objekt auf die Variable zugegriffen werden soll. Nachfolgende Argumente zum Aufruf stellen Werte dar, die für den Zugriffsmodus wichtig sind. Beispielsweise erfordern die verschiedenen Zugriffsmodi compare-and-set oder compare-and-exchange zwei nachfolgende Argumente für den erwarteten Wert und den neuen Wert der Variablen.

Die Arität und die Typen von Argumenten für den Aufruf einer Zugriffsmodusmethode werden nicht statisch überprüft. Stattdessen gibt jede Zugriffsmodusmethode eine #accessModeType(AccessMode) access mode typean, die als instance von MethodTypedargestellt wird, die als eine Art Methodensignatur dient, mit der die Argumente dynamisch überprüft werden. Ein Zugriffsmodustyp gibt formale Parametertypen in Bezug auf die Koordinatentypen eines VarHandle-instance und die Typen für Werte, die für den Zugriffsmodus wichtig sind. Ein Zugriffsmodustyp gibt auch einen Rückgabetyp an, häufig in Bezug auf den Variablentyp eines VarHandle-instance. Wenn eine Zugriffsmodusmethode für eine VarHandle-instance aufgerufen wird, müssen der symbolische Typdeskriptor an der Aufrufwebsite, die Laufzeittypen von Argumenten für den Aufruf und der Laufzeittyp des Rückgabewerts mit den im Zugriffsmodustyp angegebenen Typen übereinstimmen. Wenn die Übereinstimmung fehlschlägt, wird eine Laufzeit-Ausnahme ausgelöst.

Die Zugriffsmodusmethode #compareAndSet gibt beispielsweise an, dass, wenn der Empfänger ein VarHandle-instance mit Koordinatentypen CT1, ..., CTn und Variablentyp Tist, der Zugriffsmodustyp ist(CT1 c1, ..., CTn cn, T expectedValue, T newValue)boolean. Angenommen, ein VarHandle-instance kann auf Arrayelemente zugreifen, und seine Koordinatentypen sind String[] und int der Variablentyp ist String. Der Zugriffsmodustyp für compareAndSet in diesem VarHandle-instance wäre (String[] c1, int c2, String expectedValue, String newValue)boolean. Eine solche VarHandle-instance kann von den MethodHandles#arrayElementVarHandle(Class) array factory method Arrayelementen und wie folgt erstellt werden:

{@code
            String[] sa = ...
            VarHandle avh = MethodHandles.arrayElementVarHandle(String[].class);
            boolean r = avh.compareAndSet(sa, 10, "expected", "new");
            }

Zugriffsmodi steuern Atomaritäts- und Konsistenzeigenschaften. <em>Plain</em> read (get) und write (set) sind nur für Verweise und für primitive Werte von höchstens 32 Bits bitweise atomar und erzwingen keine beobachtbaren Sortierungseinschränkungen in Bezug auf andere Threads als den ausführenden Thread. <em>Opaque</em-Vorgänge> sind bitweise atomisch und kohärent geordnet in Bezug auf Zugriffe auf dieselbe Variable. Zusätzlich zu den undurchsichtigen Eigenschaften <werden Lesevorgänge im Acquire<>/em-Modus> und deren nachfolgende Zugriffe nach übereinstimmenden <>Schreibvorgängen im Release<-/em-Modus> und deren vorherigen Zugriffen sortiert. Zusätzlich zu den Eigenschaften "Acquire" und "Release" sind alle <flüchtigen></em-Vorgänge> vollständig aufeinander geordnet.

Zugriffsmodi sind in die folgenden Kategorien gruppiert: <ul><li-Lesezugriffsmodi>, die den Wert einer Variablen unter den angegebenen Speicherreihenfolgeeffekten abrufen. Der Satz der entsprechenden Zugriffsmodusmethoden, die zu dieser Gruppe gehören, besteht aus den Methoden #get get, #getVolatile getVolatile, #getAcquire getAcquire, #getOpaque getOpaque. <Li-Schreibzugriffsmodi>, die den Wert einer Variablen unter den angegebenen Speicherreihenfolgeneffekten festlegen. Der Satz der entsprechenden Zugriffsmodusmethoden, die zu dieser Gruppe gehören, besteht aus den Methoden #set set, #setVolatile setVolatile, #setRelease setRelease, #setOpaque setOpaque. <li>atomic update access mode, die z. B. den Wert einer Variablen unter den angegebenen Speicherreihenfolgeneffekten atomar vergleichen und festlegen. Der Satz der entsprechenden Zugriffsmodusmethoden, die zu dieser Gruppe gehören, besteht aus den Methoden #compareAndSet compareAndSet, #weakCompareAndSetPlain weakCompareAndSetPlain, , #weakCompareAndSet weakCompareAndSet#weakCompareAndSetAcquire weakCompareAndSetAcquire#weakCompareAndSetRelease weakCompareAndSetRelease, #compareAndExchange compareAndExchange#compareAndExchangeAcquire compareAndExchangeAcquire, #getAndSet getAndSet#compareAndExchangeRelease compareAndExchangeRelease, , #getAndSetAcquire getAndSetAcquire. #getAndSetRelease getAndSetRelease <Li>numerische atomische Update-Zugriffsmodi, die z. B. atomar abrufen und festlegen, wobei der Wert einer Variablen unter angegebenen Speicherreihenfolgeneffekten hinzugefügt wird. Der Satz der entsprechenden Zugriffsmodusmethoden, die zu dieser Gruppe gehören, besteht aus den Methoden #getAndAdd getAndAdd, #getAndAddAcquire getAndAddAcquire, #getAndAddRelease getAndAddRelease, li>< bitweise atomare Update-Zugriffsmodi, die z. B. atomar abrufen und bitweise OR den Wert einer Variablen unter angegebenen Speicherreihenfolgeneffekten. Der Satz der entsprechenden Zugriffsmodusmethoden, die zu dieser Gruppe gehören, besteht aus den Methoden #getAndBitwiseOr getAndBitwiseOr, #getAndBitwiseOrAcquire getAndBitwiseOrAcquire, #getAndBitwiseOrRelease getAndBitwiseOrRelease, #getAndBitwiseAndAcquire getAndBitwiseAndAcquire#getAndBitwiseAnd getAndBitwiseAnd, #getAndBitwiseAndRelease getAndBitwiseAndRelease#getAndBitwiseXor getAndBitwiseXor, #getAndBitwiseXorAcquire getAndBitwiseXorAcquire, , . #getAndBitwiseXorRelease getAndBitwiseXorRelease </ul>

Factorymethoden, die oder java.lang.invoke.MethodHandles.Lookup lookup VarHandle-Instanzen erzeugen, dokumentieren den Satz der unterstützten Zugriffsmodi. Dies kann auch Dokumentationseinschränkungen basierend auf dem Variablentyp und der Angabe umfassen, ob eine Variable schreibgeschützt ist. Wenn ein Zugriffsmodus nicht unterstützt wird, löst die entsprechende Zugriffsmodusmethode beim Aufruf eine aus UnsupportedOperationException. Factorymethoden sollten alle zusätzlichen nicht deklarierten Ausnahmen dokumentieren, die von Zugriffsmodusmethoden ausgelöst werden können. Der #get get Zugriffsmodus wird für alle VarHandle-Instanzen unterstützt, und die entsprechende Methode löst nie aus UnsupportedOperationException. Wenn ein VarHandle auf eine schreibgeschützte Variable (z. B. ein final Feld) verweist, werden schreibgeschützte, atomare Updates, numerische atomische Updates und bitweise atomische Updatezugriffsmodi nicht unterstützt, und entsprechende Methoden lösen aus UnsupportedOperationException. Lese-/Schreibzugriffsmodi (sofern unterstützt), mit Ausnahme von get und set, bieten den atomaren Zugriff für Verweistypen und alle primitiven Typen. Sofern in der Dokumentation einer Factorymethode nicht anders angegeben, bieten die Zugriffsmodi get und set (sofern unterstützt) den atomaren Zugriff für Verweistypen und alle Primitiventypen mit Ausnahme von long und double auf 32-Bit-Plattformen.

Zugriffsmodi überschreiben alle Speicherreihenfolgeeffekte, die am Deklarationsort einer Variablen angegeben sind. Beispielsweise greift ein VarHandle, der über den get Zugriffsmodus auf ein Feld zugreift, auf das Feld zu, wie durch seinen Zugriffsmodus</em> angegeben<>, auch wenn dieses Feld deklariert volatileist. Wenn gemischter Zugriff durchgeführt wird, ist äußerste Vorsicht zu beachten, da das Java-Speichermodell möglicherweise überraschende Ergebnisse zulässt.

Zusätzlich zur Unterstützung des Zugriffs auf Variablen unter verschiedenen Zugriffsmodi wird auch eine Reihe statischer Methoden, die als Speicherzaunmethoden bezeichnet werden, für eine differenzierte Steuerung der Speicherreihenfolge bereitgestellt.

Die Java-Sprachspezifikation ermöglicht es anderen Threads, Vorgänge so zu beobachten, als ob sie in anderen Reihenfolgen ausgeführt wurden als im Programmquellcode, vorbehaltlich einschränkungen, die z. B. durch die Verwendung von Sperren, volatile Feldern oder VarHandles entstehen. Die statischen Methoden , #fullFence fullFence#acquireFence acquireFence, #releaseFence releaseFenceund #loadLoadFence loadLoadFence#storeStoreFence storeStoreFencekönnen auch verwendet werden, um Einschränkungen zu erzwingen. Ihre Spezifikationen, wie dies bei bestimmten Zugriffsmodi der Fall ist, sind in Bezug auf das Fehlen von "Neuordnungen" formuliert – beobachtbare Reihenfolgeneffekte, die andernfalls auftreten könnten, wenn der Zaun nicht vorhanden wäre. Eine genauere Formulierung der Spezifikation von Zugriffsmodusmethoden und Speicherzaunmethoden kann mit zukünftigen Updates der Java-Sprachspezifikation einhergehen.

<h1>Kompilieren des Aufrufs von Zugriffsmodusmethoden</h1> Ein Java-Methodenaufrufausdruck, der eine Zugriffsmodusmethode benennt, kann einen VarHandle aus Dem Java-Quellcode aufrufen. Aus Sicht des Quellcodes können diese Methoden beliebige Argumente annehmen, und ihr polymorphes Ergebnis (falls ausgedrückt) kann in einen beliebigen Rückgabetyp umgewandelt werden. Formal wird dies erreicht, indem den Zugriffsmodusmethoden variablen Arity-Argumente Object und Object Rückgabetypen zugewiesen werden (wenn der Rückgabetyp polymorph ist), aber sie haben eine zusätzliche Qualität namens <em>signature polymorphism</em> , die diese Aufruffreiheit direkt mit dem JVM-Ausführungsstapel verbindet.

Wie bei virtuellen Methoden üblich, werden Aufrufe von Zugriffsmodusmethoden auf Quellebene in eine invokevirtual Anweisung kompiliert. Ungewöhnlicher ist, dass der Compiler die tatsächlichen Argumenttypen aufzeichnen muss und möglicherweise keine Methodenaufrufkonvertierungen für die Argumente durchführt. Stattdessen muss es Anweisungen generieren, um sie gemäß ihren eigenen nicht konvertierten Typen auf den Stapel zu pushen. Das VarHandle-Objekt selbst wird auf den Stapel vor den Argumenten gepusht. Der Compiler generiert dann eine invokevirtual Anweisung, die die Zugriffsmodusmethode mit einem symbolischen Typdeskriptor aufruft, der das Argument und die Rückgabetypen beschreibt.

Um einen vollständigen symbolischen Typdeskriptor auszugeben, muss der Compiler auch den Rückgabetyp (wenn polymorph) bestimmen. Dies basiert auf einer Umwandlung auf den Methodenaufrufausdruck, falls vorhanden, oder wenn Object der Aufruf ein Ausdruck ist oder wenn void der Aufruf eine -Anweisung ist. Die Umwandlung kann in einen primitiven Typ (aber nicht void) erfolgen.

Als Eckfall erhält ein uncasted-Argument null den symbolischen Typdeskriptor von java.lang.Void. Die Mehrdeutigkeit mit dem Typ Void ist harmlos, da es außer dem NULL-Verweis keine Verweise vom Typ Void gibt.

<h1>"invoke">Ausführen des Aufrufs von Zugriffsmodusmethoden</h1> Wenn eine invokevirtual Anweisung zum ersten Mal ausgeführt wird, wird sie verknüpft, indem die Namen in der Anweisung symbolisch aufgelöst und überprüft werden, ob der Methodenaufruf statisch zulässig ist. Dies gilt auch für Aufrufe von Zugriffsmodusmethoden. In diesem Fall wird der vom Compiler ausgegebene symbolische Typdeskriptor auf die richtige Syntax überprüft, und die darin enthaltenen Namen werden aufgelöst. Daher wird eine invokevirtual Anweisung, die eine Zugriffsmodusmethode aufruft, immer verknüpft, solange der symbolische Typdeskriptor syntaktisch wohlgeformt ist und die Typen vorhanden sind.

Wenn nach dem invokevirtual Verknüpfen ausgeführt wird, wird der empfangende VarHandle-Zugriffsmodustyp zuerst von der JVM überprüft, um sicherzustellen, dass er mit dem symbolischen Typdeskriptor übereinstimmt. Wenn die Typübereinstimmung fehlschlägt, bedeutet dies, dass die Zugriffsmodusmethode, die der Aufrufer aufruft, für die einzelne aufgerufene VarHandle nicht vorhanden ist.

Der Aufruf einer Zugriffsmodusmethode verhält sich wie bei einem Aufruf von MethodHandle#invoke, wobei das empfangende Methodenhandle die VarHandle-instance als führendes Argument akzeptiert. Genauer gesagt, das folgende, wobei {access-mode} dem Namen der Zugriffsmodusmethode entspricht:

{@code
            VarHandle vh = ..
            R r = (R) vh.{access-mode}(p1, p2, ..., pN);
            }

verhält sich so, als ob:

{@code
            VarHandle vh = ..
            VarHandle.AccessMode am = VarHandle.AccessMode.valueFromMethodName("{access-mode}");
            MethodHandle mh = MethodHandles.varHandleExactInvoker(
                                  am,
                                  vh.accessModeType(am));

            R r = (R) mh.invoke(vh, p1, p2, ..., pN)
            }

(Methoden des Modulo-Zugriffsmodus deklarieren das Auslösen von Throwablenicht . Das entspricht:

{@code
            MethodHandle mh = MethodHandles.lookup().findVirtual(
                                  VarHandle.class,
                                  "{access-mode}",
                                  MethodType.methodType(R, p1, p2, ..., pN));

            R r = (R) mh.invokeExact(vh, p1, p2, ..., pN)
            }

wobei der gewünschte Methodentyp der symbolische Typdeskriptor ist und ein MethodHandle#invokeExact ausgeführt wird, da der Handle vor dem Aufruf des Ziels referenzierte Umwandlungen nach Bedarf und Box-, Unbox- oder Verbreiterung primitiver Werte anwendet, als ob von MethodHandle#asType asType (siehe auch MethodHandles#varHandleInvoker).

Prägnant ist ein solches Verhalten gleichbedeutend mit:

{@code
            VarHandle vh = ..
            VarHandle.AccessMode am = VarHandle.AccessMode.valueFromMethodName("{access-mode}");
            MethodHandle mh = vh.toMethodHandle(am);

            R r = (R) mh.invoke(p1, p2, ..., pN)
            }

Wobei in diesem Fall das Methodenhandle an die VarHandle-instance gebunden ist.

<h1>Aufrufprüfung</h1> In typischen Programmen ist der VarHandle-Zugriffsmodustypabgleich in der Regel erfolgreich. Wenn jedoch eine Übereinstimmung fehlschlägt, löst die JVM einen aus WrongMethodTypeException.

Daher kann ein Zugriffsmodustypkonflikt, der als Verknüpfungsfehler in einem statisch typisierten Programm angezeigt wird, als dynamisch WrongMethodTypeException in einem Programm angezeigt werden, das VarHandles verwendet.

Da Zugriffsmodustypen "Live" Class -Objekte enthalten, berücksichtigt der Methodentypabgleich sowohl Typnamen als auch Klassenladevorgänge. Selbst wenn ein VarHandle VH in einem Klassenladeprogramm L1 erstellt und in einem anderen L2verwendet wird, sind VarHandle-Zugriffsmodus-Methodenaufrufe typsicher, da der symbolische Typdeskriptor des Aufrufers, wie in L2aufgelöst, mit dem symbolischen Typdeskriptor der ursprünglich aufgerufenen Methode abgeglichen wird, wie in L1aufgelöst. Die Auflösung in L1 erfolgt, wenn VH erstellt und die Zugriffsmodustypen zugewiesen werden, während die Auflösung in L2 erfolgt, wenn die invokevirtual Anweisung verknüpft ist.

Abgesehen von Typdeskriptorprüfungen ist die Fähigkeit eines VarHandles, auf die Variablen zuzugreifen, uneingeschränkt. Wenn ein VarHandle für eine nicht öffentliche Variable von einer Klasse gebildet wird, die Zugriff auf diese Variable hat, kann das resultierende VarHandle an beliebiger Stelle von jedem Aufrufer verwendet werden, der einen Verweis darauf empfängt.

Im Gegensatz zur Core Reflection-API, bei der der Zugriff jedes Mal überprüft wird, wenn eine reflektierende Methode aufgerufen wird, wird die VarHandle-Zugriffsüberprüfung durchgeführt, wenn die VarHandle-Instanz erstellt wird. Daher sollten VarHandles für nicht öffentliche Variablen oder Variablen in nicht öffentlichen Klassen im Allgemeinen geheim gehalten werden. Sie sollten nicht an nicht vertrauenswürdigen Code übergeben werden, es sei denn, ihre Verwendung aus dem nicht vertrauenswürdigen Code wäre harmlos.

<h1>VarHandle-Erstellung</h1> Java-Code kann eine VarHandle erstellen, die direkt auf jedes Feld zugreift, auf das für diesen Code zugegriffen werden kann. Dies erfolgt über eine reflektierende, funktionsbasierte API namens java.lang.invoke.MethodHandles.Lookup MethodHandles.Lookup. Beispielsweise kann ein VarHandle für ein nicht statisches Feld von java.lang.invoke.MethodHandles.Lookup#findVarHandle Lookup.findVarHandleabgerufen werden. Es gibt auch eine Konvertierungsmethode aus Core Reflection-API-Objekten, java.lang.invoke.MethodHandles.Lookup#unreflectVarHandle Lookup.unreflectVarHandle.

Der Zugriff auf geschützte Feldmember ist nur auf Empfänger der Zugriffsklasse oder einer ihrer Unterklassen beschränkt, und die Zugriffsklasse muss wiederum eine Unterklasse (oder gleichgeordnete Paket) der definierenden Klasse des geschützten Elements sein. Wenn ein VarHandle auf ein geschütztes nicht statisches Feld einer deklarierenden Klasse außerhalb des aktuellen Pakets verweist, wird das Empfängerargument auf den Typ der zugreifenden Klasse beschränkt.

<h1>Interoperation zwischen VarHandles und der Core Reflection-API</h1> Mithilfe von Factorymethoden in der java.lang.invoke.MethodHandles.Lookup Lookup API kann jedes durch ein Core Reflection API-Objekt dargestellte Feld in ein verhaltensäquivalentes VarHandle konvertiert werden. Beispielsweise kann ein reflektierender java.lang.reflect.Field Field Wert mithilfe java.lang.invoke.MethodHandles.Lookup#unreflectVarHandle Lookup.unreflectVarHandlevon in ein VarHandle konvertiert werden. Die resultierenden VarHandles bieten in der Regel einen direkteren und effizienteren Zugriff auf die zugrunde liegenden Felder.

Wenn die Core Reflection-API zum Anzeigen der polymorphen Signaturzugriffsmodusmethoden in dieser Klasse verwendet wird, werden diese als gewöhnliche nicht polymorphe Methoden angezeigt. Ihr reflektierendes Aussehen, wie von java.lang.Class#getDeclaredMethod Class.getDeclaredMethodbetrachtet, bleibt von ihrer speziellen status in dieser API unberührt. Meldet beispielsweise genau die Modifiziererbits, java.lang.reflect.Method#getModifiers Method.getModifiers die für jede ähnlich deklarierte Methode erforderlich sind, einschließlich in diesem Fall native und varargs Bits.

Wie bei jeder reflektierten Methode können diese Methoden (wenn sie reflektiert werden) direkt über java.lang.reflect.Method#invoke java.lang.reflect.Method.invoke, über JNI oder indirekt über java.lang.invoke.MethodHandles.Lookup#unreflect Lookup.unreflectaufgerufen werden. Solche reflektierenden Aufrufe führen jedoch nicht zu Zugriffsmodusmethodenaufrufen. Wenn ein solcher Aufruf das erforderliche Argument (ein einzelnes argument vom Typ Object[]) übergeben hat, ignoriert das Argument und löst ein aus UnsupportedOperationException.

Da invokevirtual Anweisungen nativ VarHandle-Zugriffsmodusmethoden unter jedem symbolischen Typdeskriptor aufrufen können, steht diese reflektierende Ansicht in Konflikt mit der normalen Darstellung dieser Methoden über Bytecodes. Daher können diese nativen Methoden, wenn sie reflektiert von Class.getDeclaredMethodbetrachtet werden, nur als Platzhalter betrachtet werden.

Verwenden Sie java.lang.invoke.MethodHandles#varHandleExactInvoker oder java.lang.invoke.MethodHandles#varHandleInvoker, um eine Aufrufermethode für einen bestimmten Zugriffsmodustyp abzurufen. Die java.lang.invoke.MethodHandles.Lookup#findVirtual Lookup.findVirtual API kann auch ein Methodenhandle zurückgeben, um eine Zugriffsmodusmethode für jeden angegebenen Zugriffsmodustyp aufzurufen, und entspricht im Verhalten java.lang.invoke.MethodHandles#varHandleInvoker.

<h1>Interoperation zwischen VarHandles und Java generics</h1> Ein VarHandle kann für eine Variable abgerufen werden, z. B. ein Feld, das mit generischen Java-Typen deklariert wird. Wie bei der Core Reflection-API wird der Variablentyp von VarHandle nach dem Löschen des Typs auf Quellebene erstellt. Wenn eine VarHandle-Zugriffsmodusmethode aufgerufen wird, können die Typen ihrer Argumente oder der Rückgabewert-Casttyp generische Typen oder Typinstanzen sein. In diesem Fall ersetzt der Compiler diese Typen durch ihre Löschungen, wenn er den symbolischen Typdeskriptor für die invokevirtual Anweisung erstellt.

In 9 hinzugefügt.

Java-Dokumentation für java.lang.invoke.VarHandle.

Teile dieser Seite sind Änderungen, die auf Arbeiten basieren, die vom Android Open Source Project erstellt und freigegeben wurden und gemäß den In der Attribution License beschriebenen Begriffen verwendet werden.

Konstruktoren

VarHandle(IntPtr, JniHandleOwnership)

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

Eigenschaften

Class

Gibt die Laufzeitklasse dieses Objectzurück.

(Geerbt von Object)
Handle

Das Handle für die zugrunde liegende Android-instance.

(Geerbt von Object)
JniIdentityHashCode

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

(Geerbt von Object)
JniPeerMembers

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

PeerReference

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

(Geerbt von Object)
ThresholdClass

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

ThresholdType

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

Methoden

AccessModeType(VarHandle+AccessMode)

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

AcquireFence()

Stellt sicher, dass Ladungen vor dem Zaun nicht mit Ladungen und Speichern nach dem Zaun neu angeordnet werden.

Clone()

Erstellt und gibt eine Kopie dieses Objekts zurück.

(Geerbt von Object)
CompareAndExchange(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

CompareAndExchangeAcquire(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

CompareAndExchangeRelease(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

CompareAndSet(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

CoordinateTypes()

Gibt die Koordinatentypen für dieses VarHandle zurück.

Dispose()

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

(Geerbt von Object)
Dispose(Boolean)

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

(Geerbt von Object)
Equals(Object)

Gibt an, ob ein anderes Objekt "gleich" diesem objekt ist.

(Geerbt von Object)
FullFence()

Stellt sicher, dass Ladungen und Lager vor dem Zaun nicht nach dem Zaun neu sortiert werden.

Get(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

GetAcquire(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

GetAndAdd(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

GetAndAddAcquire(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

GetAndAddRelease(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

GetAndBitwiseAnd(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

GetAndBitwiseAndAcquire(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

GetAndBitwiseAndRelease(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

GetAndBitwiseOr(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

GetAndBitwiseOrAcquire(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

GetAndBitwiseOrRelease(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

GetAndBitwiseXor(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

GetAndBitwiseXorAcquire(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

GetAndBitwiseXorRelease(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

GetAndSet(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

GetAndSetAcquire(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

GetAndSetRelease(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

GetHashCode()

Gibt einen Hashcodewert für das Objekt zurück.

(Geerbt von Object)
GetOpaque(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

GetVolatile(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

IsAccessModeSupported(VarHandle+AccessMode)

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

JavaFinalize()

Wird vom Garbage Collector für ein Objekt aufgerufen, wenn die Garbage Collection feststellt, dass keine Verweise mehr auf das Objekt vorhanden sind.

(Geerbt von Object)
LoadLoadFence()

Stellt sicher, dass Ladungen vor dem Zaun nicht mit Lasten nach dem Zaun neu sortiert werden.

Notify()

Aktiviert einen einzelnen Thread, der auf den Monitor dieses Objekts wartet.

(Geerbt von Object)
NotifyAll()

Aktiviert alle Threads, die auf den Monitor dieses Objekts warten.

(Geerbt von Object)
ReleaseFence()

Stellt sicher, dass Ladungen und Lager vor dem Zaun nicht nach dem Zaun neu sortiert werden.

Set(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

SetHandle(IntPtr, JniHandleOwnership)

Legt die Handle-Eigenschaft fest.

(Geerbt von Object)
SetOpaque(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

SetRelease(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

SetVolatile(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

StoreStoreFence()

Stellt sicher, dass Geschäfte vor dem Zaun nicht nach dem Zaun neu sortiert werden.

ToArray<T>()

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

(Geerbt von Object)
ToMethodHandle(VarHandle+AccessMode)

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

ToString()

Gibt eine Zeichenfolgendarstellung des Objekts zurück.

(Geerbt von Object)
UnregisterFromRuntime()

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

(Geerbt von Object)
VarType()

Gibt den Variablentyp der Variablen zurück, auf die von diesem VarHandle verwiesen wird.

Wait()

Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert ist, in der Regel durch <>Benachrichtigung</em> oder <em>interrupted</em>.

(Geerbt von Object)
Wait(Int64)

Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert ist, in der Regel durch>< Benachrichtigung</em> oder <em>interrupted</em>, oder bis eine bestimmte Menge an Echtzeit verstrichen ist.

(Geerbt von Object)
Wait(Int64, Int32)

Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert ist, in der Regel durch>< Benachrichtigung</em> oder <em>interrupted</em>, oder bis eine bestimmte Menge an Echtzeit verstrichen ist.

(Geerbt von Object)
WeakCompareAndSet(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

WeakCompareAndSetAcquire(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

WeakCompareAndSetPlain(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

WeakCompareAndSetRelease(Object[])

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

Explizite Schnittstellenimplementierungen

IJavaPeerable.Disposed()

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

(Geerbt von Object)
IJavaPeerable.DisposeUnlessReferenced()

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

(Geerbt von Object)
IJavaPeerable.Finalized()

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

(Geerbt von Object)
IJavaPeerable.JniManagedPeerState

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

(Geerbt von Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

(Geerbt von Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

(Geerbt von Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

(Geerbt von Object)

Erweiterungsmethoden

JavaCast<TResult>(IJavaObject)

Führt eine Typkonvertierung mit Überprüfung der Android-Laufzeit aus.

JavaCast<TResult>(IJavaObject)

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

GetJniTypeName(IJavaPeerable)

VarHandle ist ein dynamisch stark typisierter Verweis auf eine Variable oder eine parametrisch definierte Familie von Variablen, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer Off-Heap-Datenstruktur.

Gilt für: