Поделиться через


VarHandle Класс

Определение

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

[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
Наследование
VarHandle
Атрибуты

Комментарии

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи. Доступ к таким переменным поддерживается в различных <режимах< доступа em>/em>, включая обычный доступ для чтения и записи, переменный доступ на чтение и запись, а также сравнение и набор.

VarHandles неизменяемы и не имеют видимого состояния. VarHandles не может быть подклассом пользователя.

VarHandle имеет: <ul><li>a #varType variable type T, тип каждой переменной, на которую ссылается этот VarHandle; и <ли>список #coordinateTypes coordinate typesCT1, CT2, ..., CTnтипов выражений< координат em>/em>, <которые совместно находят переменную, на которую ссылается этот VarHandle. <Переменные /ul> и типы координат могут быть примитивными или ссылочными, и представлены объектами Class . Список типов координат может быть пустым.

Методы фабрики, создающие или java.lang.invoke.MethodHandles.Lookup lookup экземпляры VarHandle, документируют поддерживаемый тип переменной и список типов координат.

Каждый режим доступа связан с одним <>методом< режима доступа em/em>, сигнатурным полиморфным методом с именем режима доступа. Если метод режима доступа вызывается в экземпляре VarHandle, начальные аргументы вызова являются выражениями координат, указывающими, в каком объекте требуется получить доступ к переменной. Конечные аргументы вызова представляют значения важности для режима доступа. Например, для различных режимов доступа compare-and-set или compare-and-exchange требуются два конечных аргумента для ожидаемого значения переменной и нового значения.

Arity и типы аргументов к вызову метода режима доступа не проверяются статически. Вместо этого каждый метод режима доступа указывает #accessModeType(AccessMode) access mode type, представленный как экземпляр MethodType, который служит типом сигнатуры метода, с которой аргументы проверяются динамически. Тип режима доступа предоставляет формальные типы параметров с точки зрения типов координат экземпляра VarHandle и типов значений важности режима доступа. Тип режима доступа также предоставляет возвращаемый тип, часто с точки зрения типа переменной экземпляра VarHandle. При вызове метода режима доступа в экземпляре VarHandle дескриптор символьного типа на сайте вызова, типы аргументов во время выполнения и тип времени выполнения возвращаемого значения должны соответствовать типам, заданным в типе режима доступа. Исключение среды выполнения будет возникать, если совпадение завершается ошибкой.

Например, метод #compareAndSet режима доступа указывает, что если его получатель является экземпляром VarHandle с типами CT1, ..., CTn координат и типом Tпеременной, то его тип режима доступа имеет значение (CT1 c1, ..., CTn cn, T expectedValue, T newValue)boolean. Предположим, что экземпляр VarHandle может получить доступ к элементам массива, и что его типы координат находятся String[] и int в то время как его тип переменной равен String. Тип режима доступа для compareAndSet этого экземпляра VarHandle будет (String[] c1, int c2, String expectedValue, String newValue)boolean. Такой экземпляр VarHandle может быть создан элементами массива и получить доступ к ней MethodHandles#arrayElementVarHandle(Class) array factory method следующим образом:

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

Режимы доступа управляют атомарностью и свойствами согласованности. <Доступ для чтения () и записиset (get) em Plain</em>> гарантированно будет побитово атомарным только для ссылок и для примитивных значений не более 32 бит, и не накладывает никаких наблюдаемых ограничений порядка в отношении потоков, отличных от исполняемого потока. <Операции em Opaque</em>> побитовые атомарные и последовательно упорядочены в отношении доступа к той же переменной. Помимо выполнения непрозрачных свойств, <>операции чтения в режиме получения< и em> и последующие доступы упорядочивается после сопоставления <операций записи в режиме em>release</em> и их предыдущих доступа. Помимо соблюдения свойств получения и выпуска, все <>операции Em Volatile</em> полностью упорядочены относительно друг друга.

Режимы доступа группируются в следующие категории: <режимы доступа на чтение ul><li>, которые получают значение переменной в соответствии с указанными эффектами упорядочивания памяти. Набор соответствующих методов режима доступа, принадлежащих этой группе, состоит из методов #get get, , #getVolatile getVolatile, #getAcquire getAcquire#getOpaque getOpaque. <режимы доступа li>, которые задают значение переменной в указанных эффектах упорядочивания памяти. Набор соответствующих методов режима доступа, принадлежащих этой группе, состоит из методов #set set, , #setVolatile setVolatile, #setRelease setRelease#setOpaque setOpaque. <>режимы доступа к атомарным обновлениям, которые, например, атомарно сравнивают и задают значение переменной в соответствии с указанными эффектами упорядочивания памяти. Набор соответствующих методов режима доступа, принадлежащих этой группе, состоит из методов #compareAndSet compareAndSet, #weakCompareAndSet weakCompareAndSet. #getAndSetAcquire getAndSetAcquire#getAndSetRelease getAndSetRelease#weakCompareAndSetPlain weakCompareAndSetPlain#weakCompareAndSetAcquire weakCompareAndSetAcquire#weakCompareAndSetRelease weakCompareAndSetRelease#compareAndExchangeAcquire compareAndExchangeAcquire#compareAndExchange compareAndExchange#compareAndExchangeRelease compareAndExchangeRelease#getAndSet getAndSet <режимы>доступа к числовым атомарным обновлениям, которые, например, атомарно получают и задаются с добавлением значения переменной в соответствии с указанными эффектами упорядочивания памяти. Набор соответствующих методов режима доступа, принадлежащих этой группе, состоит из методов #getAndAdd getAndAdd, <#getAndAddAcquire getAndAddAcquire#getAndAddRelease getAndAddRelease, ли>побитовых режимов доступа к атомарным обновлениям, которые, например, атомарно получают и побитовую или значение переменной в соответствии с указанными эффектами упорядочивания памяти. Набор соответствующих методов режима доступа, принадлежащих этой группе, состоит из методов #getAndBitwiseOr getAndBitwiseOr, #getAndBitwiseAnd getAndBitwiseAnd. #getAndBitwiseXorRelease getAndBitwiseXorRelease#getAndBitwiseXorAcquire getAndBitwiseXorAcquire#getAndBitwiseOrAcquire getAndBitwiseOrAcquire#getAndBitwiseOrRelease getAndBitwiseOrRelease#getAndBitwiseAndAcquire getAndBitwiseAndAcquire#getAndBitwiseAndRelease getAndBitwiseAndRelease#getAndBitwiseXor getAndBitwiseXor </ul>

Методы фабрики, создающие или java.lang.invoke.MethodHandles.Lookup lookup экземпляры VarHandle, документируют набор поддерживаемых режимов доступа, которые также могут включать ограничения документирования на основе типа переменной и только для чтения. Если режим доступа не поддерживается, соответствующий метод режима доступа вызовет вызов UnsupportedOperationException. Методы фабрики должны документировать любые дополнительные необъявленные исключения, которые могут быть вызваны методами режима доступа. Режим #get get доступа поддерживается для всех экземпляров VarHandle, и соответствующий метод никогда не вызывается UnsupportedOperationException. Если VarHandle ссылается на переменную только для чтения (например final , поле), то запись, атомарное обновление, числовое атомарное обновление и побитовые режимы доступа к атомарным обновлениям не поддерживаются и соответствующие методы вызываются UnsupportedOperationException. Режимы доступа для чтения и записи (если поддерживаются), за исключением get и setпредоставляют атомарный доступ для ссылочных типов и всех примитивных типов. Если в документации по методу фабрики не указано иное, режимы get доступа и set (если поддерживаются) предоставляют атомарный доступ для ссылочных типов и всех типов примитивов, за исключением longdouble 32-разрядных платформ.

Режимы доступа переопределяют любые эффекты упорядочивания памяти, указанные на сайте объявления переменной. Например, VarHandle, обращающийся к полю с помощью get режима доступа, будет получать доступ к полю, как указано>< в режиме доступа< или em>, даже если это поле объявленоvolatile. Если смешанный доступ выполняется крайне важно, так как модель памяти Java может позволить удивительным результатам.

Помимо поддержки доступа к переменным в различных режимах доступа, набор статических методов, называемых методами ограждения памяти, также предоставляется для точного управления упорядочением памяти.

Спецификация языка Java позволяет другим потокам наблюдать за операциями, как если бы они были выполнены в заказах, отличных от очевидных в исходном коде программы, при условии ограничений, например при использовании блокировок, volatile полей или VarHandles. Статические методы, #fullFence fullFence, #releaseFence releaseFence#acquireFence acquireFence, #loadLoadFence loadLoadFence и #storeStoreFence storeStoreFence, также можно использовать для применения ограничений. Их спецификации, как и для определенных режимов доступа, фразы с точки зрения отсутствия "переупорядочения" - наблюдаемые эффекты упорядочения, которые могут произойти в противном случае, если ограждение не было. Более точное выражение спецификации методов доступа и методов ограждения памяти может сопровождать будущие обновления спецификации языка Java.

<h1>Компиляция вызовов методов< режима доступа/h1> Выражение вызова метода Java, именующее метод режима доступа, может вызывать VarHandle из исходного кода Java. С точки зрения исходного кода эти методы могут принимать любые аргументы и их полиморфный результат (если выражение) можно привести к любому типу возвращаемого значения. Формально это достигается путем предоставления аргументов переменной arity Object методов доступа и Object возвращаемых типов (если тип возвращаемого значения является полиморфным), но они имеют дополнительное качество под названием <em>сигнатурный полиморфизм</em> , который подключает эту свободу вызова непосредственно к стеку выполнения JVM.

Как и в случае с виртуальными методами, вызовы уровня источника для методов режима доступа компилируются в инструкцию invokevirtual . Более необычно компилятор должен записать фактические типы аргументов и не выполнять преобразования вызовов метода для аргументов. Вместо этого он должен создавать инструкции для отправки их в стек в соответствии с собственными неконвертируемыми типами. Сам объект VarHandle будет отправляться в стек перед аргументами. Затем компилятор создает invokevirtual инструкцию, которая вызывает метод режима доступа с дескриптором символьного типа, описывающего аргумент и типы возвращаемых значений.

Чтобы выдать полный дескриптор символьного типа, компилятор должен также определить тип возвращаемого значения (если полиморфный). Это основано на приведение выражения вызова метода, если имеется одно или другое, если вызов является выражением, или в противном случае Objectvoid , если вызов является оператором. Приведение может быть к примитивному типу (но не void).

В качестве углового регистра неадресованный null аргумент получает дескриптор java.lang.Voidсимвольного типа. Неоднозначность с типом Void безвредна, так как нет ссылок типа Void , кроме ссылки null.

<h1>"invoke">Выполнение вызова методов< режима доступа/h1> При первом invokevirtual выполнении инструкции она связана символично разрешая имена в инструкции и проверяя, является ли вызов метода статически законным. Это также содержит вызовы методов режима доступа. В этом случае дескриптор символьного типа, создаваемый компилятором, проверяется правильный синтаксис, и имена, содержащиеся в нем, разрешаются. Таким образом, инструкция, которая вызывает метод режима доступа, всегда будет связываться, invokevirtual если дескриптор символьного типа синтаксически сформирован и типы существуют.

invokevirtual При выполнении связывания тип режима доступа VarHandle сначала проверяется JVM, чтобы убедиться, что он соответствует дескриптору символьного типа. Если совпадение типов завершается ошибкой, это означает, что вызывающий метод режима доступа отсутствует в вызываемом отдельном объекте VarHandle.

Вызов метода режима доступа ведет себя так, как если бы вызов MethodHandle#invoke, где дескриптор получения метода принимает экземпляр VarHandle в качестве ведущего аргумента. В частности, следующее, где {access-mode} соответствует имени метода режима доступа:

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

ведет себя так, как будто:

{@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)
            }

(методы режима доступа в модуле Throwableне объявляют исключение). Это соответствует следующей записи:

{@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)
            }

где требуемый тип метода является дескриптор символьного типа и MethodHandle#invokeExact выполняется, так как перед вызовом целевого объекта дескриптор будет применять ссылочные приведения при необходимости и поля, распаковки или расширенные примитивные значения, как будто MethodHandle#asType asType (см. также MethodHandles#varHandleInvoker).

Более кратким образом такое поведение эквивалентно следующему:

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

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

В этом случае дескриптор метода привязан к экземпляру VarHandle.

<h1>Проверка< вызова/h1> В типичных программах сопоставление типов режима доступа VarHandle обычно будет выполнено успешно. Но если совпадение завершается ошибкой, JVM вызовет ошибку WrongMethodTypeException.

Таким образом, несоответствие типа режима доступа, которое может отображаться как ошибка компоновки в статической типизированной программе может отображаться как динамический WrongMethodTypeException в программе, которая использует VarHandles.

Так как типы режима доступа содержат "динамические" Class объекты, сопоставление типов метода учитывает имена типов и загрузчики классов. Таким образом, даже если метод VarHandle VH создается в одном загрузчике L1 класса и используется в другом L2, вызовы метода доступа VarHandle являются типобезопасны, так как дескриптор символьного типа вызывающего объекта, как разрешено L2, соответствует дескриптору символьного типа исходного вызываемого метода, как разрешено в L1. L1 Разрешение происходит при VH создании и назначении типов режима доступа, а разрешение L2 происходит при связывании инструкцииinvokevirtual.

Помимо проверок дескриптора типа, возможность VarHandles для доступа к переменным неограничен. Если VarHandle формируется в недоступной переменной классом, имеющим доступ к этой переменной, результирующий VarHandle может использоваться в любом месте любым вызывающим лицом, получающим ссылку на него.

В отличие от API основного отражения, где доступ проверяется каждый раз при вызове отражающего метода, проверка доступа VarHandle выполняется при создании VarHandle. Таким образом, VarHandles к недоступным переменным или переменным в ненаграционных классах, как правило, должен храниться в секрете. Они не должны передаваться в ненадежный код, если их использование из ненадежного кода не будет безвредным.

<Код Java h1>VarHandle/h1> может создать код VarHandle<, который напрямую обращается к любому полю, доступному для этого кода. Это делается с помощью отражающего, вызываемого java.lang.invoke.MethodHandles.Lookup MethodHandles.LookupAPI на основе возможностей. Например, varHandle для нестаттического поля можно получить из java.lang.invoke.MethodHandles.Lookup#findVarHandle Lookup.findVarHandle. Существует также метод преобразования из объектов API core Reflection, java.lang.invoke.MethodHandles.Lookup#unreflectVarHandle Lookup.unreflectVarHandle.

Доступ к защищенным элементам поля ограничен получателями только класса доступа или одного из его подклассов, а класс доступа должен в свою очередь быть подклассом (или братом пакета) определяющего класса защищенного члена. Если VarHandle ссылается на защищенное нестатическое поле декларационного класса за пределами текущего пакета, аргумент приемника будет сокращен до типа класса доступа.

<h1>Взаимодействие между VarHandles и API< отражения ядра/h1> С помощью методов фабрики java.lang.invoke.MethodHandles.Lookup Lookup в API можно преобразовать любое поле, представленное объектом API core Reflection, в поведение эквивалентное VarHandle. Например, отражение java.lang.reflect.Field Field можно преобразовать в VarHandle с помощью java.lang.invoke.MethodHandles.Lookup#unreflectVarHandle Lookup.unreflectVarHandle. Результирующий VarHandles обычно обеспечивает более прямой и эффективный доступ к базовым полям.

В качестве специального случая, когда API отражения ядра используется для просмотра методов режима полиморфного доступа подписи в этом классе, они отображаются как обычные неполморфные методы. Их отражающий внешний вид, как показано java.lang.Class#getDeclaredMethod Class.getDeclaredMethodв представлении, не влияет на их особый статус в этом API. Например, java.lang.reflect.Method#getModifiers Method.getModifiers будет сообщаться именно эти биты модификатора, необходимые для любого аналогично объявленного метода, в том числе в этом случае native и varargs битах.

Как и в случае с любым отраженным методом, эти методы (при отражении) могут вызываться напрямую через java.lang.reflect.Method#invoke java.lang.reflect.Method.invokeJNI или косвенно через java.lang.invoke.MethodHandles.Lookup#unreflect Lookup.unreflect. Однако такие отражающие вызовы не приводят к вызову метода режима доступа. Такой вызов, если передан обязательный аргумент (один, тип Object[]), будет игнорировать аргумент и будет вызывать исключение UnsupportedOperationException.

Так как invokevirtual инструкции могут вызывать методы режима доступа VarHandle в любом дескрипторе символьного типа, это отражающее представление конфликтует с обычным представлением этих методов через байт-коды. Таким образом, эти собственные методы, которые отражаются в Class.getDeclaredMethodпредставлении, могут рассматриваться только как заполнители.

Чтобы получить метод вызова для определенного типа режима доступа, используйте java.lang.invoke.MethodHandles#varHandleExactInvoker или java.lang.invoke.MethodHandles#varHandleInvoker. java.lang.invoke.MethodHandles.Lookup#findVirtual Lookup.findVirtual API также может возвращать дескриптор метода для вызова метода режима доступа для любого указанного типа режима доступа и эквивалентен поведениюjava.lang.invoke.MethodHandles#varHandleInvoker.

<H1>Взаимодействие между VarHandles и java generics</h1> A VarHandle можно получить для переменной, например поля, которое объявляется с универсальными типами Java. Как и в случае с API отражения ядра, тип переменной VarHandle будет создан на основе стирки типа исходного уровня. При вызове метода режима доступа VarHandle типы его аргументов или возвращаемый тип приведения значений могут быть универсальными типами или экземплярами типов. Если это происходит, компилятор заменит эти типы своими эраустрами при создании дескриптора символьного типа для инструкции invokevirtual .

Добавлено в 9.

Документация по Java для java.lang.invoke.VarHandle.

Части этой страницы — это изменения на основе работы, созданной и общей проектом с открытым исходным кодом Android и используемой в соответствии с условиями, описанными в лицензии Creative Commons 2.5 Attribution.

Конструкторы

VarHandle(IntPtr, JniHandleOwnership)

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

Свойства

Class

Возвращает класс среды выполнения этого Objectобъекта.

(Унаследовано от Object)
Handle

Дескриптор базового экземпляра Android.

(Унаследовано от Object)
JniIdentityHashCode

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

(Унаследовано от Object)
JniPeerMembers

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

PeerReference

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

(Унаследовано от Object)
ThresholdClass

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

ThresholdType

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

Методы

AccessModeType(VarHandle+AccessMode)

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

AcquireFence()

Гарантирует, что нагрузки до забора не будут переупорядочены с нагрузками и магазинами после забора.

Clone()

Создает и возвращает копию этого объекта.

(Унаследовано от Object)
CompareAndExchange(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

CompareAndExchangeAcquire(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

CompareAndExchangeRelease(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

CompareAndSet(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

CoordinateTypes()

Возвращает типы координат для этого VarHandle.

Dispose()

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

(Унаследовано от Object)
Dispose(Boolean)

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

(Унаследовано от Object)
Equals(Object)

Указывает, равен ли другой объект этому объекту.

(Унаследовано от Object)
FullFence()

Гарантирует, что нагрузки и магазины до забора не будут переупорядочены с нагрузками и магазинами после забора.

Get(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

GetAcquire(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

GetAndAdd(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

GetAndAddAcquire(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

GetAndAddRelease(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

GetAndBitwiseAnd(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

GetAndBitwiseAndAcquire(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

GetAndBitwiseAndRelease(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

GetAndBitwiseOr(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

GetAndBitwiseOrAcquire(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

GetAndBitwiseOrRelease(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

GetAndBitwiseXor(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

GetAndBitwiseXorAcquire(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

GetAndBitwiseXorRelease(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

GetAndSet(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

GetAndSetAcquire(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

GetAndSetRelease(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

GetHashCode()

Возвращает значение хэш-кода для объекта.

(Унаследовано от Object)
GetOpaque(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

GetVolatile(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

IsAccessModeSupported(VarHandle+AccessMode)

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

JavaFinalize()

Вызывается сборщиком мусора в объекте, когда сборка мусора определяет, что больше ссылок на объект нет.

(Унаследовано от Object)
LoadLoadFence()

Гарантирует, что нагрузки до забора не будут переупорядочены с нагрузками после забора.

Notify()

Пробуждение одного потока, ожидающего монитора этого объекта.

(Унаследовано от Object)
NotifyAll()

Просыпает все потоки, ожидающие монитора этого объекта.

(Унаследовано от Object)
ReleaseFence()

Гарантирует, что нагрузки и магазины до забора не будут переупорядочены с магазинами после забора.

Set(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

SetHandle(IntPtr, JniHandleOwnership)

Задает свойство Handle.

(Унаследовано от Object)
SetOpaque(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

SetRelease(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

SetVolatile(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

StoreStoreFence()

Гарантирует, что магазины до забора не будут переупорядочены с магазинами после забора.

ToArray<T>()

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

(Унаследовано от Object)
ToMethodHandle(VarHandle+AccessMode)

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

ToString()

Возвращает строковое представление объекта.

(Унаследовано от Object)
UnregisterFromRuntime()

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

(Унаследовано от Object)
VarType()

Возвращает тип переменной переменных, на которые ссылается этот VarHandle.

Wait()

Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>помощи уведомления</em> или <эм>прерванного</em>.

(Унаследовано от Object)
Wait(Int64)

Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>получении уведомления</>em или <>эм прервано< или> до тех пор, пока не истекло определенное количество реального времени.

(Унаследовано от Object)
Wait(Int64, Int32)

Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>получении уведомления</>em или <>эм прервано< или> до тех пор, пока не истекло определенное количество реального времени.

(Унаследовано от Object)
WeakCompareAndSet(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

WeakCompareAndSetAcquire(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

WeakCompareAndSetPlain(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

WeakCompareAndSetRelease(Object[])

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

Явные реализации интерфейса

IJavaPeerable.Disposed()

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

(Унаследовано от Object)
IJavaPeerable.DisposeUnlessReferenced()

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

(Унаследовано от Object)
IJavaPeerable.Finalized()

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

(Унаследовано от Object)
IJavaPeerable.JniManagedPeerState

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

(Унаследовано от Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

(Унаследовано от Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

(Унаследовано от Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

(Унаследовано от Object)

Методы расширения

JavaCast<TResult>(IJavaObject)

Выполняет преобразование типа, проверяемого средой выполнения Android.

JavaCast<TResult>(IJavaObject)

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

GetJniTypeName(IJavaPeerable)

VarHandle — это динамически типизированная ссылка на переменную или параметрически определенную семейство переменных, включая статические поля, нестатические поля, элементы массива или компоненты структуры данных вне кучи.

Применяется к