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> 下支持访问此类变量,包括纯读/写访问、易失性读/写访问以及 compare-and-set。

VarHandles 是不可变的,没有可见状态。 无法由用户对 VarHandles 进行子类化。

VarHandle 具有:<ul<>li>a #varType variable type T、此 VarHandle 引用的每个变量的类型;以及 <li>a list ofCT1, CT2, ..., CTn#coordinateTypes coordinate types, the types of <em>coordinate expressions</em> that jointly locate a variable referenced by this VarHandle. </ul> 变量和坐标类型可以是基元或引用,并由对象表示 Class 。 坐标类型列表可能为空。

生成或 java.lang.invoke.MethodHandles.Lookup lookup VarHandle 实例的工厂方法记录支持的变量类型和坐标类型列表。

每个访问模式都与一个 <em>访问模式方法</em> 相关联,这是一种为访问模式命名的签名多态方法。 在 VarHandle 实例上调用访问模式方法时,调用的初始参数是坐标表达式,用于指示要访问变量的对象。 调用的尾随参数表示访问模式的重要性值。 例如,各种比较和集或比较交换访问模式需要变量的预期值和新值的两个尾随参数。

不会静态检查调用访问模式方法的 arity 和类型。 相反,每个访问模式方法指定一个 #accessModeType(AccessMode) access mode type表示为实例 MethodType的方法签名,用作动态检查参数的方法签名。 访问模式类型根据 VarHandle 实例的坐标类型以及访问模式重要性值的类型提供正式参数类型。 访问模式类型还提供返回类型,通常以 VarHandle 实例的变量类型表示。 在 VarHandle 实例上调用访问模式方法时,调用站点上的符号类型描述符、调用参数的运行时类型以及返回值的运行时类型必须与访问模式类型中给定的类型匹配。 如果匹配失败,将引发运行时异常。

例如,访问模式方法 #compareAndSet 指定,如果接收方是具有坐标类型和变量类型的 CT1, ..., CTnTVarHandle 实例,则其访问模式类型为 (CT1 c1, ..., CTn cn, T expectedValue, T newValue)boolean。 假设 VarHandle 实例可以访问数组元素,并且其坐标类型为 String[] 变量 int 类型 String。 此 VarHandle 实例的访问模式类型 compareAndSet(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");
            }

访问模式控制原子性和一致性属性。 <em>Plain</em> read (get) 和 write (set) 访问保证仅为引用和基元值(最多 32 位)按位原子,并且不会对执行线程以外的线程施加可观察的排序约束。 <em>Opaque</em> 操作在访问同一变量时是按位原子排序的,是一致的排序。 除了遵循 Opaque 属性之外, <em>Acquire</em> 模式读取及其后续访问在匹配 <em>Release</em> 模式写入及其以前的访问之后进行排序。 除了服从 Acquire 和 Release 属性外,所有 <em>Volatile</em> 操作都完全按彼此排序。

访问模式分为以下类别: <ul><li>读取访问模式,这些模式在指定的内存排序效果下获取变量的值。 属于此组的相应访问模式方法集由方法#get get#getVolatile getVolatile#getAcquire getAcquire#getOpaque getOpaque。 <li>写入访问模式,用于在指定的内存排序效果下设置变量的值。 属于此组的相应访问模式方法集由方法#set set#setVolatile setVolatile#setRelease setRelease#setOpaque setOpaque。 <li>原子更新访问模式,例如,在指定的内存排序效果下以原子方式比较和设置变量的值。 属于此组的相应访问模式方法集由方法#compareAndSet compareAndSet#weakCompareAndSetPlain weakCompareAndSetPlain#weakCompareAndSet weakCompareAndSet#weakCompareAndSetRelease weakCompareAndSetRelease#weakCompareAndSetAcquire weakCompareAndSetAcquire、、#compareAndExchangeAcquire compareAndExchangeAcquire、、#compareAndExchange compareAndExchange#compareAndExchangeRelease compareAndExchangeRelease#getAndSet getAndSet、、 #getAndSetAcquire getAndSetAcquire#getAndSetRelease getAndSetRelease组成。 <li>数值原子更新访问模式,例如,以原子方式获取和设置,并在指定的内存排序效果下添加变量的值。 属于此组的相应访问模式方法集由方法#getAndAdd getAndAdd#getAndAddAcquire getAndAddAcquire、<#getAndAddRelease getAndAddReleaseli>位原子更新访问模式组成,例如,在指定的内存排序效果下,以原子方式获取和按位或变量的值。 属于此组的相应访问模式方法集由方法#getAndBitwiseOr getAndBitwiseOr#getAndBitwiseOrAcquire getAndBitwiseOrAcquire#getAndBitwiseOrRelease getAndBitwiseOrRelease#getAndBitwiseAnd getAndBitwiseAnd#getAndBitwiseAndAcquire getAndBitwiseAndAcquire#getAndBitwiseAndRelease getAndBitwiseAndRelease#getAndBitwiseXor getAndBitwiseXor、、 、。 #getAndBitwiseXorAcquire getAndBitwiseXorAcquire#getAndBitwiseXorRelease getAndBitwiseXorRelease </ul>

生成或 java.lang.invoke.MethodHandles.Lookup lookup VarHandle 实例的工厂方法记录支持的访问模式集,这可能还包括基于变量类型的记录限制以及变量是否为只读。 如果不支持访问模式,则调用时相应的访问模式方法将引发 。UnsupportedOperationException 工厂方法应记录访问模式方法可能引发的任何其他未声明异常。 #get get所有 VarHandle 实例都支持访问模式,相应的方法永远不会引发UnsupportedOperationException。 如果 VarHandle 引用只读变量(例如 final 字段),则不支持写入、原子更新、数值原子更新和按位原子更新访问模式,并且引发 UnsupportedOperationException相应的方法。 读取/写入访问模式(如果受支持),除引用getset类型和所有基元类型外,还提供原子访问。 除非在工厂方法的文档中另有说明,否则访问模式get和(如果受支持)为引用类型和所有基元类型提供原子访问,但 32 位平台上除外doublelongset

访问模式将覆盖变量声明站点中指定的任何内存排序效果。 例如,使用访问模式访问字段的 get VarHandle 将通过其访问模式/em> 指定的><字段访问字段,<即使声明volatile该字段也是如此。 执行混合访问时,应格外小心,因为 Java 内存模型可能会产生令人惊讶的结果。

除了支持在各种访问模式下访问变量之外,还提供了一组称为内存围栏方法的静态方法,用于精细控制内存排序。

Java 语言规范允许其他线程观察操作,就像按照程序源代码中明显的顺序执行操作一样,受诸如锁、 volatile 字段或 VarHandles 使用的约束的约束。 静态方法、#fullFence fullFence#acquireFence acquireFence#releaseFence releaseFence#loadLoadFence loadLoadFence#storeStoreFence storeStoreFence,还可用于施加约束。 它们的规范,如某些访问模式的情况一样,在缺少“重新排序”方面被短语短语 -- 可观察的排序效果,如果围栏不存在,则可能会发生这种情况。 更精确的访问模式方法和内存围栏方法规范的措辞可能伴随着 Java 语言规范的未来更新。

<h1>编译调用访问模式方法</h1> Java 方法调用表达式,命名访问模式方法可以从 Java 源代码调用 VarHandle。 从源代码的角度来看,这些方法可以采用任何参数及其多态结果(如果表示)可以强制转换为任何返回类型。 通过提供访问模式方法变量 arity Object 参数和Object返回类型(如果返回类型为多态),但具有称为 em>签名多态<性/em> 的附加质量<,它将这种调用自由直接连接到 JVM 执行堆栈。

与虚拟方法一样,对访问模式方法的源级调用编译为指令 invokevirtual 。 更不寻常的是,编译器必须记录实际参数类型,并且可能不会对参数执行方法调用转换。 相反,它必须生成指令,以便根据自己的非转换类型在堆栈上推送它们。 VarHandle 对象本身将在参数之前推送到堆栈上。 然后,编译器生成一个 invokevirtual 指令,该指令使用描述符(描述参数和返回类型)调用访问模式方法。

若要发出完整的符号类型描述符,编译器还必须确定返回类型(如果多态)。 这基于方法调用表达式的强制转换,如果有,或者 Object 调用是表达式,或者 void 调用是语句。 强制转换可能为基元类型(但不能 void)。

作为一个角落情况,未转换 null 的参数被赋予符号类型描述符 java.lang.Void。 该类型的 Void 不明确性是无害的,因为除了 null 引用之外没有类型的 Void 引用。

<h1>“invoke”>执行访问模式方法<的调用/h1> 第一次 invokevirtual 执行指令时,通过以符号方式解析指令中的名称并验证方法调用是否静态合法来链接它。 这也适用于对访问模式方法的调用。 在这种情况下,会检查编译器发出的符号类型描述符是否具有正确的语法,并解析它包含的名称。 因此, invokevirtual 只要符号类型描述符格式正确且类型存在,调用访问模式方法的指令将始终链接。

invokevirtual链接后执行该操作时,JVM 首先会检查接收 VarHandle 的访问模式类型,以确保它与符号类型描述符匹配。 如果类型匹配失败,则表示调用方调用的访问模式方法在调用的单个 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)
            }

其中,所需方法类型是符号类型描述符,并且执行 a MethodHandle#invokeExact ,因为在调用目标之前,句柄将根据需要应用引用强制转换,并根据需要应用框、取消装箱或扩大基元值,就好像按( MethodHandle#asType asTypeMethodHandles#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

因此,访问模式类型不匹配(可能在静态类型化程序中显示为链接错误)可以在使用 VarHandles 的程序中显示为动态 WrongMethodTypeException

由于访问模式类型包含“live” Class 对象,因此方法类型匹配将同时考虑类型名称和类加载程序。 因此,即使在一个类加载器中创建 VarHandle VH 并在另L2一个类加载器L1中使用,VarHandle 访问模式方法调用也是类型安全的,因为调用方的符号类型描述符(如所L2解析)与原始被调用方方法的符号类型描述符匹配(如中解析)。L1 在创建时进行解析L1,并且分配了其访问模式类型,而当指令链接时invokevirtualL2会发生VH解析。

除了类型描述符检查之外,VarHandles 访问变量的功能不受限制。 如果 VarHandle 由有权访问该变量的类在非公共变量上形成,则任何接收对变量的引用的调用方都可以在任何位置使用生成的 VarHandle。

与核心反射 API 不同,每次调用反射方法时都会检查访问权限,在创建 VarHandle 时执行 VarHandle 访问检查。 因此,对于非公共变量或非公共类中的变量,VarHandles 通常应保密。 不应将其传递给不受信任的代码,除非从不受信任的代码使用是无害的。

<h1>VarHandle 创建</h1> Java 代码可以创建一个 VarHandle,该代码直接访问该代码可访问的任何字段。 这是通过调用 java.lang.invoke.MethodHandles.Lookup MethodHandles.Lookup反射的基于功能的 API 完成的。 例如,可以从中获取 java.lang.invoke.MethodHandles.Lookup#findVarHandle Lookup.findVarHandle非静态字段的 VarHandle。 核心反射 API 对象 java.lang.invoke.MethodHandles.Lookup#unreflectVarHandle Lookup.unreflectVarHandle也有转换方法。

对受保护字段成员的访问仅限于访问类或其子类之一的接收方,访问类必须反过来成为受保护成员定义类的子类(或包同级)。 如果 VarHandle 引用当前包外部声明类的受保护非静态字段,接收方参数将缩小到访问类的类型。

<VarHandles 与核心反射 API</h1> 之间的 h1>互操作使用 API 中的java.lang.invoke.MethodHandles.Lookup Lookup工厂方法,核心反射 API 对象表示的任何字段都可以转换为行为等效的 VarHandle。 例如,可以使用反光 java.lang.reflect.Field Field 镜转换为 VarHandle java.lang.invoke.MethodHandles.Lookup#unreflectVarHandle Lookup.unreflectVarHandle。 生成的 VarHandles 通常提供对基础字段的更直接且高效的访问。

作为一种特殊情况,当核心反射 API 用于查看此类中的签名多态访问模式方法时,它们显示为普通的非多态方法。 它们的反光外观,如此 API java.lang.Class#getDeclaredMethod Class.getDeclaredMethod所查看,不受其特殊状态影响。 例如, java.lang.reflect.Method#getModifiers Method.getModifiers 将准确报告任何类似声明的方法所需的修饰符位,包括在这种情况下 nativevarargs 位。

与任何反射方法一样,可以通过 JNI 或间接java.lang.invoke.MethodHandles.Lookup#unreflect Lookup.unreflect通过 java.lang.reflect.Method#invoke java.lang.reflect.Method.invokeJNI 调用这些方法(如果反映时)。 但是,此类反射调用不会导致访问模式方法调用。 如果传递了所需的参数(类型为单个 Object[]参数),则此类调用将忽略该参数,并将引发一个 UnsupportedOperationException

由于 invokevirtual 指令可以在任何符号类型描述符下本机调用 VarHandle 访问模式方法,因此这种反射视图与通过字节码对这些方法的正常表示冲突。 因此,这些本机方法在被反省地查看 Class.getDeclaredMethod时,只能被视为占位符。

若要获取特定访问模式类型的调用程序方法,请使用 java.lang.invoke.MethodHandles#varHandleExactInvokerjava.lang.invoke.MethodHandles#varHandleInvokerjava.lang.invoke.MethodHandles.Lookup#findVirtual Lookup.findVirtual API 还可以返回方法句柄,以调用任何指定访问模式类型的访问模式方法,并且行为等效于 java.lang.invoke.MethodHandles#varHandleInvoker

<对于变量(如使用 Java 泛型类型声明的字段),可以获取 VarHandles 和 Java 泛型</h1 之间的 h1>> 互操作。 与核心反射 API 一样,VarHandle 的变量类型将从源级别类型的擦除构造。 调用 VarHandle 访问模式方法时,其参数的类型或返回值强制转换类型可以是泛型类型或类型实例。 如果发生这种情况,编译器将在为指令构造符号类型描述符时将其擦除替换这些 invokevirtual 类型。

已在 9 中添加。

适用于 . 的 java.lang.invoke.VarHandleJava 文档

本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。

构造函数

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> 或 <em>interrupted</em>。<><

(继承自 Object)
Wait(Int64)

使当前线程等待直到唤醒,通常是通过 <em>通知</em> 或 <em interrupted</em>>,或直到经过一定数量的实时。

(继承自 Object)
Wait(Int64, Int32)

使当前线程等待直到唤醒,通常是通过 <em>通知</em> 或 <em interrupted</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 是对变量的动态强类型引用,或对参数定义的变量系列(包括静态字段、非静态字段、数组元素或非堆数据结构的组件)的动态强类型引用。

适用于