< prev index next >

src/java.base/share/classes/java/lang/invoke/VarHandle.java

Print this page

 456  * {@link java.lang.invoke.MethodHandles#varHandleInvoker}.
 457  *
 458  * <h2>Interoperation between VarHandles and Java generics</h2>
 459  * A VarHandle can be obtained for a variable, such as a field, which is
 460  * declared with Java generic types.  As with the Core Reflection API, the
 461  * VarHandle's variable type will be constructed from the erasure of the
 462  * source-level type.  When a VarHandle access mode method is invoked, the
 463  * types
 464  * of its arguments or the return value cast type may be generic types or type
 465  * instances.  If this occurs, the compiler will replace those types by their
 466  * erasures when it constructs the symbolic type descriptor for the
 467  * {@code invokevirtual} instruction.
 468  *
 469  * @see MethodHandle
 470  * @see MethodHandles
 471  * @see MethodType
 472  * @since 9
 473  */
 474 public abstract sealed class VarHandle implements Constable
 475      permits IndirectVarHandle, LazyInitializingVarHandle, SegmentVarHandle,

 476              VarHandleByteArrayAsChars.ByteArrayViewVarHandle,
 477              VarHandleByteArrayAsDoubles.ByteArrayViewVarHandle,
 478              VarHandleByteArrayAsFloats.ByteArrayViewVarHandle,
 479              VarHandleByteArrayAsInts.ByteArrayViewVarHandle,
 480              VarHandleByteArrayAsLongs.ByteArrayViewVarHandle,
 481              VarHandleByteArrayAsShorts.ByteArrayViewVarHandle,
 482              VarHandleBooleans.Array,
 483              VarHandleBooleans.FieldInstanceReadOnly,
 484              VarHandleBooleans.FieldStaticReadOnly,
 485              VarHandleBytes.Array,
 486              VarHandleBytes.FieldInstanceReadOnly,
 487              VarHandleBytes.FieldStaticReadOnly,
 488              VarHandleChars.Array,
 489              VarHandleChars.FieldInstanceReadOnly,
 490              VarHandleChars.FieldStaticReadOnly,
 491              VarHandleDoubles.Array,
 492              VarHandleDoubles.FieldInstanceReadOnly,
 493              VarHandleDoubles.FieldStaticReadOnly,
 494              VarHandleFloats.Array,
 495              VarHandleFloats.FieldInstanceReadOnly,
 496              VarHandleFloats.FieldStaticReadOnly,
 497              VarHandleInts.Array,
 498              VarHandleInts.FieldInstanceReadOnly,
 499              VarHandleInts.FieldStaticReadOnly,
 500              VarHandleLongs.Array,
 501              VarHandleLongs.FieldInstanceReadOnly,
 502              VarHandleLongs.FieldStaticReadOnly,
 503              VarHandleReferences.Array,
 504              VarHandleReferences.FieldInstanceReadOnly,
 505              VarHandleReferences.FieldStaticReadOnly,
 506              VarHandleShorts.Array,
 507              VarHandleShorts.FieldInstanceReadOnly,
 508              VarHandleShorts.FieldStaticReadOnly {


 509     final VarForm vform;
 510     final boolean exact;
 511 
 512     VarHandle(VarForm vform) {
 513         this(vform, false);
 514     }
 515 
 516     VarHandle(VarForm vform, boolean exact) {
 517         this.vform = vform;
 518         this.exact = exact;
 519     }
 520 
 521     /**
 522      * Returns the target VarHandle.   Subclasses may override this method to implement
 523      * additional logic for example lazily initializing the declaring class of a static field var handle.



 524      */
 525     @ForceInline
 526     VarHandle target() {
 527         return asDirect();
 528     }
 529 
 530     /**
 531      * Returns the direct target VarHandle.   Indirect VarHandle subclasses should implement
 532      * this method.

 533      *
 534      * @see #getMethodHandle(int)
 535      * @see #checkAccessModeThenIsDirect(AccessDescriptor)
 536      */
 537     @ForceInline
 538     VarHandle asDirect() {
 539         return this;
 540     }
 541 
 542     /**
 543      * Returns {@code true} if this VarHandle has <a href="#invoke-exact-behavior"><em>invoke-exact behavior</em></a>.
 544      *
 545      * @see #withInvokeExactBehavior()
 546      * @see #withInvokeBehavior()
 547      * @return {@code true} if this VarHandle has <a href="#invoke-exact-behavior"><em>invoke-exact behavior</em></a>.
 548      * @since 16
 549      */
 550     public boolean hasInvokeExactBehavior() {
 551         return exact;
 552     }

 456  * {@link java.lang.invoke.MethodHandles#varHandleInvoker}.
 457  *
 458  * <h2>Interoperation between VarHandles and Java generics</h2>
 459  * A VarHandle can be obtained for a variable, such as a field, which is
 460  * declared with Java generic types.  As with the Core Reflection API, the
 461  * VarHandle's variable type will be constructed from the erasure of the
 462  * source-level type.  When a VarHandle access mode method is invoked, the
 463  * types
 464  * of its arguments or the return value cast type may be generic types or type
 465  * instances.  If this occurs, the compiler will replace those types by their
 466  * erasures when it constructs the symbolic type descriptor for the
 467  * {@code invokevirtual} instruction.
 468  *
 469  * @see MethodHandle
 470  * @see MethodHandles
 471  * @see MethodType
 472  * @since 9
 473  */
 474 public abstract sealed class VarHandle implements Constable
 475      permits IndirectVarHandle, LazyInitializingVarHandle, SegmentVarHandle,
 476              ArrayVarHandle, VarHandles.StaticFieldVarHandle,
 477              VarHandleByteArrayAsChars.ByteArrayViewVarHandle,
 478              VarHandleByteArrayAsDoubles.ByteArrayViewVarHandle,
 479              VarHandleByteArrayAsFloats.ByteArrayViewVarHandle,
 480              VarHandleByteArrayAsInts.ByteArrayViewVarHandle,
 481              VarHandleByteArrayAsLongs.ByteArrayViewVarHandle,
 482              VarHandleByteArrayAsShorts.ByteArrayViewVarHandle,
 483              VarHandleBooleans.Array,
 484              VarHandleBooleans.FieldInstanceReadOnly,

 485              VarHandleBytes.Array,
 486              VarHandleBytes.FieldInstanceReadOnly,

 487              VarHandleChars.Array,
 488              VarHandleChars.FieldInstanceReadOnly,

 489              VarHandleDoubles.Array,
 490              VarHandleDoubles.FieldInstanceReadOnly,

 491              VarHandleFloats.Array,
 492              VarHandleFloats.FieldInstanceReadOnly,

 493              VarHandleInts.Array,
 494              VarHandleInts.FieldInstanceReadOnly,

 495              VarHandleLongs.Array,
 496              VarHandleLongs.FieldInstanceReadOnly,


 497              VarHandleReferences.FieldInstanceReadOnly,

 498              VarHandleShorts.Array,
 499              VarHandleShorts.FieldInstanceReadOnly,
 500              VarHandleFlatValues.FieldInstanceReadOnly,
 501              VarHandleNonAtomicReferences.FieldInstanceReadOnly,
 502              VarHandleNonAtomicFlatValues.FieldInstanceReadOnly {
 503     final VarForm vform;
 504     final boolean exact;
 505 
 506     VarHandle(VarForm vform) {
 507         this(vform, false);
 508     }
 509 
 510     VarHandle(VarForm vform, boolean exact) {
 511         this.vform = vform;
 512         this.exact = exact;
 513     }
 514 
 515     /**
 516      * A barrier for accessing a target var handle used by static var handle
 517      * implementation methods.  This allows initialization barriers and strict
 518      * field initialization checks.
 519      *
 520      * @param reading whether this access performs any read
 521      */
 522     @ForceInline
 523     VarHandle onStaticFieldAccess(boolean reading) {
 524         return this;
 525     }
 526 
 527     /**
 528      * Returns the direct VarHandle, passed into the method handle that perform
 529      * conversions or has the actual implementation when this VarHandle is
 530      * indirect.
 531      *
 532      * @see #getMethodHandle(int)
 533      * @see #checkAccessModeThenIsDirect(AccessDescriptor)
 534      */
 535     @ForceInline
 536     VarHandle asDirect() {
 537         return this;
 538     }
 539 
 540     /**
 541      * Returns {@code true} if this VarHandle has <a href="#invoke-exact-behavior"><em>invoke-exact behavior</em></a>.
 542      *
 543      * @see #withInvokeExactBehavior()
 544      * @see #withInvokeBehavior()
 545      * @return {@code true} if this VarHandle has <a href="#invoke-exact-behavior"><em>invoke-exact behavior</em></a>.
 546      * @since 16
 547      */
 548     public boolean hasInvokeExactBehavior() {
 549         return exact;
 550     }
< prev index next >