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 引用的每个变量的类型;li>< 为 列表#coordinateTypes coordinate typesCT1, CT2, ..., CTn,这些类型的 <em>坐标表达式</em> 共同定位此 VarHandle 引用的变量。 </ul> 变量和坐标类型可以是基元类型或引用类型,并由 Class 对象表示。 坐标类型的列表可能为空。

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

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

不会静态检查访问模式方法调用的参数的种类和类型。 相反,每个访问模式方法都指定一个 #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) 和写入 (set) 访问保证仅为引用和基元值(最多 32 位)的按位原子,并且对执行线程以外的线程没有可观测的排序约束。 <em>不透明</em> 操作是按位原子的,在访问同一变量时按顺序排列。 除了遵循不透明属性外, <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>原子更新访问模式,例如,在指定的内存排序效果下以原子方式比较和设置变量的值。 属于此组的相应访问模式方法集由方法 、、#weakCompareAndSetPlain weakCompareAndSetPlain#weakCompareAndSet weakCompareAndSet#weakCompareAndSetAcquire weakCompareAndSetAcquire#compareAndExchangeAcquire compareAndExchangeAcquire#weakCompareAndSetRelease weakCompareAndSetRelease#getAndSet getAndSet#compareAndExchange compareAndExchange#compareAndExchangeRelease compareAndExchangeRelease#getAndSetAcquire getAndSetAcquire#getAndSetRelease getAndSetRelease组成。#compareAndSet compareAndSet <li>数字原子更新访问模式,例如,在指定的内存排序效果下,通过添加变量的值以原子方式获取和设置。 属于此组的相应访问模式方法集由方法 #getAndAdd getAndAdd、、<#getAndAddAcquire getAndAddAcquire#getAndAddRelease getAndAddReleaseli>按位原子更新访问模式组成,例如,原子获取和按位或指定内存排序效果下变量的值。 属于此组的相应访问模式方法集由方法 #getAndBitwiseOr getAndBitwiseOr、、#getAndBitwiseOrAcquire getAndBitwiseOrAcquire#getAndBitwiseAnd getAndBitwiseAnd#getAndBitwiseOrRelease getAndBitwiseOrRelease#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。 如果) 支持,读/写访问模式 (,但 和 set除外get,为引用类型和所有基元类型提供原子访问。 除非在工厂方法文档中另有说明,否则访问模式 getset ((如果受支持) 为引用类型和所有基元类型提供原子访问,但 32 位平台上的 longdouble 除外)。

访问模式将替代在变量的声明站点中指定的任何内存排序效果。 例如,使用访问模式访问字段的 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)
            }

其中,所需的方法类型是符号类型描述符并执行 , 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

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

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

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

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

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

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

<h1>VarHandles 与核心反射 API< 之间的互操作/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 用于查看此类中的签名多态访问模式方法时,它们显示为普通的非多态方法。 其反射外观(由 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.invoke、通过 JNI 或通过 间接调用 java.lang.invoke.MethodHandles.Lookup#unreflect Lookup.unreflect。 但是,此类反射调用不会导致访问模式方法调用。 如果将所需参数 (单个参数(类型 Object[] 为) )传递,此类调用将忽略 参数并引发 UnsupportedOperationException

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

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

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

在 9 中添加。

java.lang.invoke.VarHandleJava 文档。

此页面的某些部分是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的条款使用。

构造函数

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 是对变量或参数定义的变量系列(包括静态字段、非静态字段、数组元素或堆外数据结构的组件)的动态强类型引用。

适用于