VarHandle Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, 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
- Attribute
Hinweise
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. Der Zugriff auf solche Variablen wird unter verschiedenen <Em-Zugriffsmodi></em> unterstützt, einschließlich Nur-Lese-/Schreibzugriff, veränderliche Lese-/Schreibzugriff sowie Vergleichs- und Satzzugriff.
VarHandles sind unveränderlich und weisen keinen sichtbaren Zustand auf. VarHandles kann vom Benutzer nicht unterklassigt werden.
A VarHandle has: <ul><li>a #varType variable type
T, the type of every variable referenced by this VarHandle; and <li>a list of #coordinateTypes coordinate types
CT1, CT2, ..., CTn
, the types of <em>coordinate expressions</em> that common locate a variable referenced by this VarHandle. </ul> Variable und Koordinatentypen können Grundtyp oder Verweis sein und durch Class
Objekte dargestellt werden. Die Liste der Koordinatentypen ist möglicherweise leer.
Factorymethoden, die Instanzen erzeugen oder java.lang.invoke.MethodHandles.Lookup lookup
VarHandle erzeugen, dokumentieren den unterstützten Variablentyp und die Liste der Koordinatentypen.
Jeder Zugriffsmodus ist einer <Em-Zugriffsmodusmethode></em> zugeordnet, einer polymorphen Signaturmethode, die für den Zugriffsmodus benannt ist. Wenn eine Zugriffsmodusmethode für eine VarHandle-Instanz aufgerufen wird, sind die anfänglichen Argumente für den Aufruf Koordinatenausdrücke, die angeben, auf welches Objekt die Variable zugegriffen werden soll. Nachfolgende Argumente für den Aufruf stellen Werte von Bedeutung für den Zugriffsmodus dar. Beispielsweise erfordern die verschiedenen Vergleichs- und Vergleichs- oder Vergleichs- und Austauschzugriffsmodi zwei nachfolgende Argumente für den erwarteten Wert und neuen Wert der Variablen.
Die Arität und Die Arten von Argumenten für den Aufruf einer Zugriffsmodusmethode werden nicht statisch überprüft. Stattdessen gibt jede Zugriffsmodusmethode eine #accessModeType(AccessMode) access mode type
, dargestellt als Instanz von MethodType
) an, die als Eine Art methodensignatur dient, mit der die Argumente dynamisch überprüft werden. Ein Zugriffsmodustyp gibt formale Parametertypen in Bezug auf die Koordinatentypen einer VarHandle-Instanz und die Typen für Werte, die für den Zugriffsmodus von Bedeutung sind. Ein Zugriffsmodustyp gibt auch einen Rückgabetyp zurück, häufig im Hinblick auf den Variablentyp einer VarHandle-Instanz. Wenn eine Zugriffsmodusmethode für eine VarHandle-Instanz aufgerufen wird, muss der symbolische Typdeskriptor an der Aufrufwebsite, die Laufzeittypen von Argumenten für den Aufruf und den Laufzeittyp des Rückgabewerts mit den Typen übereinstimmen, die im Zugriffsmodustyp angegeben werden. Eine Laufzeit ausnahme wird ausgelöst, wenn die Übereinstimmung fehlschlägt.
Die Zugriffsmodusmethode #compareAndSet
gibt z. B. an, dass der Empfänger eine VarHandle-Instanz mit Koordinatentypen CT1, ..., CTn
und Variablentyp T
ist, der Zugriffsmodustyp ist (CT1 c1, ..., CTn cn, T expectedValue, T newValue)boolean
. Angenommen, eine VarHandle-Instanz kann auf Arrayelemente zugreifen und ihre Koordinatentypen sind String[]
und int
während der Variablentyp ist String
. Der Zugriffsmodustyp für compareAndSet
diese VarHandle-Instanz wäre (String[] c1, int c2, String expectedValue, String newValue)boolean
. Eine solche VarHandle-Instanz kann von den MethodHandles#arrayElementVarHandle(Class) array factory method
Arrayelementen wie folgt erstellt und darauf zugreifen:
{@code
String[] sa = ...
VarHandle avh = MethodHandles.arrayElementVarHandle(String[].class);
boolean r = avh.compareAndSet(sa, 10, "expected", "new");
}
Zugriffsmodi steuern Die Atomität und Konsistenzeigenschaften. <Em>Plain</em> read (get
) and write (set
) accesses are guaranteed to be bitwise atomic only for references and for primitive values of at most 32 bits, and impose no observable order constraints with threads other than the executing thread. <em>Opaque</em-Operationen> sind bitweise atomisch und kohärent in Bezug auf den Zugriff auf dieselbe Variable angeordnet. Zusätzlich zu den Opaque-Eigenschaften <werden em>Acquire</em-Modus> gelesen, und ihre nachfolgenden Zugriffe werden nach übereinstimmenden <Em>Release</em-Modus-Schreibvorgängen> und den vorherigen Zugriffen sortiert. Zusätzlich zu den Eigenschaften "Acquire" und "Release" werden alle <>veränderlich</em-Vorgänge> vollständig in Bezug aufeinander sortiert.
Access-Modi sind in die folgenden Kategorien unterteilt: <ul><li>Lesezugriffsmodi, die den Wert einer Variablen unter angegebenen Speicher sortieren Effekten 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>write access modes that set the value of a variable under specified memory order effects. Der Satz der entsprechenden Zugriffsmodusmethoden, die zu dieser Gruppe gehören, besteht aus den Methoden #set set
, #setVolatile setVolatile
, , #setRelease setRelease
. #setOpaque setOpaque
<Li>Atomaktualisierungszugriffsmodi, die z. B. atomisch vergleichen und den Wert einer Variablen unter angegebenen Speicher sortieren Effekten 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
, #getAndSetAcquire getAndSetAcquire
#compareAndExchangeRelease compareAndExchangeRelease
#getAndSet getAndSet
#compareAndExchangeAcquire compareAndExchangeAcquire
#compareAndExchange compareAndExchange
. . #getAndSetRelease getAndSetRelease
<Li>numerische Atomaktualisierungsmodi, die z. B. atomisch abrufen und festlegen, mit Addition des Werts einer Variablen unter angegebenen Speicherordnungseffekten. Der Satz der entsprechenden Zugriffsmodusmethoden, die zu dieser Gruppe gehören, besteht aus den Methoden #getAndAdd getAndAdd
, #getAndAddAcquire getAndAddAcquire
, , #getAndAddRelease getAndAddRelease
<li>bitweise Atomaktualisierungszugriffsmodi, die z. B. atomisch abrufen und bitweise ODER den Wert einer Variablen unter angegebenen Speicher sortieren Effekten. Der Satz der entsprechenden Zugriffsmodusmethoden, die zu dieser Gruppe gehören, besteht aus den Methoden #getAndBitwiseOr getAndBitwiseOr
, #getAndBitwiseOrAcquire getAndBitwiseOrAcquire
, , #getAndBitwiseOrRelease getAndBitwiseOrRelease
, #getAndBitwiseAnd getAndBitwiseAnd
#getAndBitwiseAndAcquire getAndBitwiseAndAcquire
, #getAndBitwiseAndRelease getAndBitwiseAndRelease
#getAndBitwiseXor getAndBitwiseXor
, . #getAndBitwiseXorAcquire getAndBitwiseXorAcquire
#getAndBitwiseXorRelease getAndBitwiseXorRelease
</ul>
Factorymethoden, die Instanzen produzieren oder java.lang.invoke.MethodHandles.Lookup lookup
VarHandle-Instanzen erstellen, dokumentieren die unterstützten Zugriffsmodi, die auch Dokumentierungseinschränkungen basierend auf dem Variablentyp und ob eine Variable schreibgeschützt ist. Wenn ein Zugriffsmodus nicht unterstützt wird, löst die entsprechende Zugriffsmodusmethode einen Aufruf 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 niemals aus UnsupportedOperationException
. Wenn eine VarHandle auf eine schreibgeschützte Variable (z. B. ein final
Feld) verweist, werden Schreib-, Atomaktualisierungs-, numerische Atomaktualisierungs- und bitweise Atomaktualisierungsmodus nicht unterstützt und entsprechende Methoden ausgelöst UnsupportedOperationException
. Lese-/Schreibzugriffsmodi (sofern unterstützt), mit Ausnahme von get
und set
, ermöglichen den Atomzugriff für Referenztypen und alle Grundtypen. Sofern nicht in der Dokumentation einer Factorymethode anders angegeben, bieten die Zugriffsmodi get
und set
(sofern unterstützt) den Atomzugriff für Referenztypen und alle Grundtypen, mit Ausnahme von long
und double
auf 32-Bit-Plattformen.
Access-Modi überschreiben alle auf der Deklarationswebsite einer Variablen angegebenen Speichersortierungseffekte. Beispielsweise greift ein VarHandle-Objekt, das über den get
Zugriffsmodus auf ein Feld zugreift, über den Zugriffsmodus</em> auf das Feld <>zu, auch wenn dieses Feld deklariert volatile
ist. Wenn gemischter Zugriff durchgeführt wird, sollte äußerste Sorgfalt durchgeführt werden, da das Java-Speichermodell ü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 fein abgestimmte Kontrolle der Speicherordnung bereitgestellt.
Die Java Language Specification ermöglicht es anderen Threads, Vorgänge zu beobachten, als ob sie in unterschiedlichen Reihenfolgen ausgeführt wurden als im Programmquellcode, vorbehaltlich von Einschränkungen, die sich z. B. aus der Verwendung von Sperren, volatile
Feldern oder VarHandles ergeben. Die statischen Methoden, #fullFence fullFence
, #acquireFence acquireFence
, , #releaseFence releaseFence
#loadLoadFence loadLoadFence
und #storeStoreFence storeStoreFence
, können auch verwendet werden, um Einschränkungen zu erzwingen. Ihre Spezifikationen, wie bei bestimmten Zugriffsmodi, werden in Bezug auf das Fehlen von "Neuanordnungen" formuliert - feststellbare Sortiereffekte, die andernfalls auftreten könnten, wenn der Zaun nicht vorhanden war. Genauere Ausdrücke der Spezifikation der Zugriffsmodusmethoden und Speicherzaunmethoden können zukünftige Aktualisierungen der Java Language Specification begleiten.
<h1>Das Kompilieren des Aufrufs von Zugriffsmodusmethoden</h1> Ein Java-Methodenaufrufausdruck, der eine Zugriffsmodusmethode benennt, kann einen VarHandle aus Java-Quellcode aufrufen. Aus der Sicht des Quellcodes können diese Methoden alle Argumente verwenden und ihr polymorphes Ergebnis (falls ausgedrückt) in einen beliebigen Rückgabetyp umwandeln. Formal wird dies erreicht, indem die Zugriffsmodusmethoden variablen Arity-Argumente Object
und Object
Rückgabetypen (wenn der Rückgabetyp polymorph ist), aber sie haben eine zusätzliche Qualität namens <em>signature polymorphism</em> , die diese Freiheit des Aufrufs direkt mit dem JVM-Ausführungsstapel verbindet.
Wie bei virtuellen Methoden üblich, werden Aufrufe auf Quellebene für Zugriffsmodusmethoden in eine invokevirtual
Anweisung kompiliert. Ungewöhnlichererweise muss der Compiler die tatsächlichen Argumenttypen aufzeichnen und kann keine Methodenaufrufe für die Argumente ausführen. Stattdessen muss es Anweisungen generieren, um sie gemäß ihren eigenen nicht konvertierten Typen auf den Stapel zu übertragen. Das VarHandle-Objekt selbst wird vor den Argumenten auf den Stapel verschoben. 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 auszustellen, muss der Compiler auch den Rückgabetyp (wenn polymorph) bestimmen. Dies basiert auf einer Umwandlung auf dem Methodenaufrufausdruck, falls vorhanden, oder anderenfalls Object
, wenn der Aufruf ein Ausdruck ist, oder auf andere void
Weise, wenn der Aufruf eine Anweisung ist. Die Umwandlung kann in einen Grundtyp (aber nicht void
) erfolgen.
Als Eckfall erhält ein uncasted-Argument null
einen symbolischen Typdeskriptor von java.lang.Void
. Die Mehrdeutigkeit mit dem Typ Void
ist harmlos, da keine Verweise vom Typ Void
vorhanden sind, mit Ausnahme des NULL-Verweises.
<h1>"invoke">Perform invocation of access mode methods</h1> The first time an invokevirtual
instruction is executed it is linked by symbolically resolving the names in the instruction and verifying that the method call is statically legal. 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 Anweisung, die eine invokevirtual
Zugriffsmodusmethode aufruft, immer verknüpfen, solange der symbolische Typdeskriptor syntaktisch wohlgeformt ist und die Typen vorhanden sind.
Wenn die invokevirtual
Nachverknüpfung ausgeführt wird, wird der Zugriffsmodustyp des empfangenden VarHandle zuerst vom JVM überprüft, um sicherzustellen, dass er mit dem symbolischen Typdeskriptor übereinstimmt. Wenn die Typabgleichung fehlschlägt, bedeutet dies, dass die Zugriffsmodusmethode, die der Aufrufer aufruft, nicht für den einzelnen VarHandle vorhanden ist, der aufgerufen wird.
Der Aufruf einer Zugriffsmodusmethode verhält sich so, als ob ein Aufruf von MethodHandle#invoke
, bei dem das Empfangsmethodenhandle die VarHandle-Instanz als führendes Argument akzeptiert. Genauer gesagt: "} {access-mode
" entspricht dem Namen der Zugriffsmodusmethode:
{@code
VarHandle vh = ..
R r = (R) vh.{access-mode}(p1, p2, ..., pN);
}
verhält sich wie:
{@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 nicht das Auslösen von Throwable
). Dieser 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)
}
wenn der gewünschte Methodentyp der symbolische Typdeskriptor ist und eine MethodHandle#invokeExact
ausgeführt wird, da vor dem Aufruf des Ziels das Handle bei Bedarf Referenzumschreibungen anwendet und Kasten-, Unbox- oder Verbreiterungsgrundtypenwerte angewendet wird, wie durch MethodHandle#asType asType
(siehe auch MethodHandles#varHandleInvoker
).
Prägnanter ist dieses 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)
}
In diesem Fall ist das Methodenhandle an die VarHandle-Instanz gebunden.
<h1>Aufrufüberprüfung</h1> In typischen Programmen wird der Zugriffsmodustypabgleich von VarHandle in der Regel erfolgreich ausgeführt. Wenn jedoch eine Übereinstimmung fehlschlägt, löst der JVM einen WrongMethodTypeException
.
Daher kann ein Typenkonflikt des Zugriffsmodus, der in einem programmgesteuerten Programm als Verknüpfungsfehler 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 Klassenladeprogramme. Selbst wenn ein VarHandle-Element VH
in einem Klassenladeprogramm L1
erstellt und in einem anderen L2
verwendet wird, sind VarHandle-Zugriffsmodus-Methodenaufrufe typsicher, da der symbolische Typdeskriptor des Aufrufers, wie in aufgelöst, L2
mit dem symbolischen Typdeskriptor der ursprünglichen Angerufenen-Methode abgeglichen wird, wie in L1
aufgelöst. Die Auflösung erfolgt beim L1
VH
Erstellen, und die Zugriffsmodustypen werden zugewiesen, während die Auflösung erfolgt L2
, wenn die invokevirtual
Anweisung verknüpft ist.
Abgesehen von Typdeskriptorprüfungen ist die Funktion einer VarHandles für den Zugriff auf die Variablen uneingeschränkt. Wenn eine VarHandle auf einer nicht öffentlichen Variable durch eine 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 erhält.
Anders als bei der Core Reflection-API, bei der der Zugriff jedes Mal überprüft wird, wenn eine reflektierende Methode aufgerufen wird, wird varHandle-Zugriffsüberprüfung ausgeführt, wenn varHandle erstellt wird. Daher sollten VarHandles auf 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 creation</h1> Java-Code kann einen VarHandle erstellen, der direkt auf jedes Feld zugreift, auf das zu diesem Code zugegriffen werden kann. Dies erfolgt über eine reflektierende, funktionsbasierte API, die aufgerufen wird java.lang.invoke.MethodHandles.Lookup MethodHandles.Lookup
. Beispielsweise kann ein VarHandle für ein nicht statisches Feld aus java.lang.invoke.MethodHandles.Lookup#findVarHandle Lookup.findVarHandle
abgerufen 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 zugreifenden Klasse oder einer seiner Unterklassen beschränkt, und die zugreifende Klasse muss wiederum eine Unterklasse (oder ein gleichgeordnetes 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 Feld, das durch ein Core Reflection API-Objekt dargestellt wird, in ein verhaltensäquivalentes VarHandle-Objekt konvertiert werden. Beispielsweise kann ein reflektierendes java.lang.reflect.Field Field
Objekt mithilfe java.lang.invoke.MethodHandles.Lookup#unreflectVarHandle Lookup.unreflectVarHandle
von VarHandle in ein VarHandle konvertiert werden. Die resultierenden VarHandles bieten im Allgemeinen direkteren und effizienteren Zugriff auf die zugrunde liegenden Felder.
Wenn die Core Reflection-API als Sonderfall verwendet wird, um die polymorphen Signaturzugriffsmodusmethoden in dieser Klasse anzuzeigen, werden sie als gewöhnliche nicht polymorphe Methoden angezeigt. Ihr reflektierendes Erscheinungsbild, wie es von java.lang.Class#getDeclaredMethod Class.getDeclaredMethod
ihnen betrachtet wird, ist von ihrem speziellen Status in dieser API nicht betroffen. Beispielsweise werden genau diese Modifiziererbits gemeldet, java.lang.reflect.Method#getModifiers Method.getModifiers
die für jede in ähnlicher Weise deklarierte Methode erforderlich sind, einschließlich in diesem Fall native
und varargs
Bits.
Wie bei jeder reflektierten Methode können diese Methoden (bei Spiegelung) direkt über java.lang.reflect.Method#invoke java.lang.reflect.Method.invoke
JNI oder indirekt über java.lang.invoke.MethodHandles.Lookup#unreflect Lookup.unreflect
JNI aufgerufen werden. Solche reflektierenden Aufrufe führen jedoch nicht zu Zugriffsmodusmethodenaufrufen. Ein solcher Aufruf, wenn das erforderliche Argument übergeben wird (ein einzelnes Argument vom Typ Object[]
), ignoriert das Argument und löst ein UnsupportedOperationException
.
Da invokevirtual
Anweisungen varHandle-Zugriffsmodusmethoden unter jedem symbolischen Typdeskriptor nativ aufrufen können, steht diese reflektierende Ansicht mit der normalen Darstellung dieser Methoden über Bytecodes in Konflikt. Daher können diese nativen Methoden, wenn sie reflektierend betrachtet Class.getDeclaredMethod
werden, nur als Platzhalter angesehen werden.
Um eine Aufrufermethode für einen bestimmten Zugriffsmodustyp abzurufen, verwenden java.lang.invoke.MethodHandles#varHandleExactInvoker
oder java.lang.invoke.MethodHandles#varHandleInvoker
. 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 dem Verhalten java.lang.invoke.MethodHandles#varHandleInvoker
.
<h1>Interoperation between VarHandles and Java generics</h1> A VarHandle can be obtained for a variable, such as a field, which is declared with Java generic types. Wie bei der Core Reflection-API wird der Variablentyp von VarHandle aus der Löschung des Quellebenentyps erstellt. Wenn eine VarHandle-Zugriffsmodusmethode aufgerufen wird, können die Typen der Argumente oder der Rückgabewert-Umwandlungstyp generische Typen oder Typinstanzen sein. Wenn dies der Fall ist, ersetzt der Compiler diese Typen durch ihre Löschungen, wenn er den symbolischen Typdeskriptor für die invokevirtual
Anweisung erstellt.
Hinzugefügt in 9.
Java-Dokumentation für java.lang.invoke.VarHandle
.
Teile dieser Seite sind Änderungen auf der Grundlage von Arbeiten, die vom Android Open Source-Projekt erstellt und freigegeben werden und gemäß den in der Creative Commons 2.5 Attribution License beschriebenen Begriffen verwendet werden.
Konstruktoren
VarHandle(IntPtr, JniHandleOwnership) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
Eigenschaften
Class |
Gibt die Laufzeitklasse dieses Werts |
Handle |
Das Handle für die zugrunde liegende Android-Instanz. (Geerbt von Object) |
JniIdentityHashCode |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. (Geerbt von Object) |
JniPeerMembers |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
PeerReference |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. (Geerbt von Object) |
ThresholdClass |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
ThresholdType |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
Methoden
AccessModeType(VarHandle+AccessMode) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
AcquireFence() |
Stellt sicher, dass Lasten vor dem Zaun nicht mit Lasten und Geschäften nach dem Zaun neu angeordnet werden. |
Clone() |
Erstellt und gibt eine Kopie dieses Objekts zurück. (Geerbt von Object) |
CompareAndExchange(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
CompareAndExchangeAcquire(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
CompareAndExchangeRelease(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
CompareAndSet(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
CoordinateTypes() |
Gibt die Koordinatentypen für diesen VarHandle-Wert zurück. |
Dispose() |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. (Geerbt von Object) |
Dispose(Boolean) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, 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 Lasten und Lager vor dem Zaun nicht mit Lasten und Geschäften nach dem Zaun neu angeordnet werden. |
Get(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
GetAcquire(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
GetAndAdd(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
GetAndAddAcquire(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
GetAndAddRelease(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
GetAndBitwiseAnd(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
GetAndBitwiseAndAcquire(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
GetAndBitwiseAndRelease(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
GetAndBitwiseOr(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
GetAndBitwiseOrAcquire(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
GetAndBitwiseOrRelease(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
GetAndBitwiseXor(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
GetAndBitwiseXorAcquire(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
GetAndBitwiseXorRelease(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
GetAndSet(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
GetAndSetAcquire(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
GetAndSetRelease(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, 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[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
GetVolatile(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
IsAccessModeSupported(VarHandle+AccessMode) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, 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 bestimmt, dass keine weiteren Verweise auf das Objekt vorhanden sind. (Geerbt von Object) |
LoadLoadFence() |
Stellt sicher, dass Lasten vor dem Zaun nicht mit Lasten nach dem Zaun neu angeordnet werden. |
Notify() |
Aktiviert einen einzelnen Thread, der auf dem Monitor dieses Objekts wartet. (Geerbt von Object) |
NotifyAll() |
Aktiviert alle Threads, die auf dem Monitor dieses Objekts warten. (Geerbt von Object) |
ReleaseFence() |
Stellt sicher, dass Lasten und Lager vor dem Zaun nicht mit Geschäften nach dem Zaun neu angeordnet werden. |
Set(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, 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[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
SetRelease(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
SetVolatile(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
StoreStoreFence() |
Stellt sicher, dass Geschäfte vor dem Zaun nicht mit Geschäften nach dem Zaun neu angeordnet werden. |
ToArray<T>() |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. (Geerbt von Object) |
ToMethodHandle(VarHandle+AccessMode) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, 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() |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. (Geerbt von Object) |
VarType() |
Gibt den Variablentyp zurück, auf den von diesem VarHandle verwiesen wird. |
Wait() |
Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch em benachrichtigt/em> oder <em>unterbrochen</em>.<>< (Geerbt von Object) |
Wait(Int64, Int32) |
Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch <em>benachrichtigt</em> oder <em>unterbrochen</em> oder bis eine bestimmte Menge an Echtzeit verstrichen ist. (Geerbt von Object) |
Wait(Int64) |
Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch <em>benachrichtigt</em> oder <em>unterbrochen</em> oder bis eine bestimmte Menge an Echtzeit verstrichen ist. (Geerbt von Object) |
WeakCompareAndSet(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
WeakCompareAndSetAcquire(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
WeakCompareAndSetPlain(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
WeakCompareAndSetRelease(Object[]) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
Explizite Schnittstellenimplementierungen
IJavaPeerable.Disposed() |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. (Geerbt von Object) |
IJavaPeerable.DisposeUnlessReferenced() |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. (Geerbt von Object) |
IJavaPeerable.Finalized() |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. (Geerbt von Object) |
IJavaPeerable.JniManagedPeerState |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. (Geerbt von Object) |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. (Geerbt von Object) |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. (Geerbt von Object) |
IJavaPeerable.SetPeerReference(JniObjectReference) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. (Geerbt von Object) |
Erweiterungsmethoden
JavaCast<TResult>(IJavaObject) |
Führt eine android-laufzeitgecheckte Typkonvertierung aus. |
JavaCast<TResult>(IJavaObject) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |
GetJniTypeName(IJavaPeerable) |
Ein VarHandle ist ein dynamisch typisierter Bezug auf eine Variable oder eine parametrisch definierte Variablenfamilie, einschließlich statischer Felder, nicht statischer Felder, Arrayelemente oder Komponenten einer off-heap-Datenstruktur. |