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 }
|