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 }
|
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,
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 VarHandleBooleans.FieldStaticReadOnly,
486 VarHandleBytes.Array,
487 VarHandleBytes.FieldInstanceReadOnly,
488 VarHandleBytes.FieldStaticReadOnly,
489 VarHandleChars.Array,
490 VarHandleChars.FieldInstanceReadOnly,
491 VarHandleChars.FieldStaticReadOnly,
492 VarHandleDoubles.Array,
493 VarHandleDoubles.FieldInstanceReadOnly,
494 VarHandleDoubles.FieldStaticReadOnly,
495 VarHandleFloats.Array,
496 VarHandleFloats.FieldInstanceReadOnly,
497 VarHandleFloats.FieldStaticReadOnly,
498 VarHandleInts.Array,
499 VarHandleInts.FieldInstanceReadOnly,
500 VarHandleInts.FieldStaticReadOnly,
501 VarHandleLongs.Array,
502 VarHandleLongs.FieldInstanceReadOnly,
503 VarHandleLongs.FieldStaticReadOnly,
504 VarHandleReferences.FieldInstanceReadOnly,
505 VarHandleReferences.FieldStaticReadOnly,
506 VarHandleShorts.Array,
507 VarHandleShorts.FieldInstanceReadOnly,
508 VarHandleShorts.FieldStaticReadOnly,
509 VarHandleFlatValues.FieldInstanceReadOnly,
510 VarHandleNonAtomicReferences.FieldInstanceReadOnly,
511 VarHandleNonAtomicReferences.FieldStaticReadOnly,
512 VarHandleNonAtomicFlatValues.FieldInstanceReadOnly {
513 final VarForm vform;
514 final boolean exact;
515
516 VarHandle(VarForm vform) {
517 this(vform, false);
518 }
519
520 VarHandle(VarForm vform, boolean exact) {
521 this.vform = vform;
522 this.exact = exact;
523 }
524
525 /**
526 * Returns the target VarHandle. Subclasses may override this method to implement
527 * additional logic for example lazily initializing the declaring class of a static field var handle.
528 */
529 @ForceInline
530 VarHandle target() {
531 return asDirect();
532 }
|