Skip to content

[GR-71699][Native Image] Invoking setter MethodHandle with Boolean fails. #12596

@christophstrobl

Description

@christophstrobl

Describe the Issue

Invoking a setter MethodHandle for a boolean field causes

java.lang.IllegalArgumentException: Can not set boolean field TestEntity.active to java.lang.Integer
	at org.graalvm.nativeimage.builder/com.oracle.svm.core.reflect.fieldaccessor.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:266)
	at org.graalvm.nativeimage.builder/com.oracle.svm.core.reflect.fieldaccessor.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:270)
	at org.graalvm.nativeimage.builder/com.oracle.svm.core.reflect.fieldaccessor.UnsafeBooleanFieldAccessorImpl.set(UnsafeBooleanFieldAccessorImpl.java:95)
	at org.graalvm.nativeimage.builder/com.oracle.svm.core.methodhandles.Util_java_lang_invoke_MethodHandle.invokeInternal(Target_java_lang_invoke_MethodHandle.java:207)
	at java.base@25/java.lang.invoke.MethodHandle.invokeBasic(MethodHandle.java:102)
	at org.graalvm.nativeimage.builder/com.oracle.svm.core.methodhandles.MethodHandleIntrinsicImpl.execute(MethodHandleIntrinsicImpl.java:179)
	at org.graalvm.nativeimage.builder/com.oracle.svm.core.methodhandles.Util_java_lang_invoke_MethodHandle.invokeInternal(Target_java_lang_invoke_MethodHandle.java:186)
	at java.base@25/java.lang.invoke.MethodHandle.invokeBasic(MethodHandle.java:102)
	at java.base@25/java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:96)
	at java.base@25/java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:914)
	at java.base@25/java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:891)
	at java.base@25/java.lang.invoke.MethodHandle.invokeBasic(MethodHandle.java:109)
	at java.base@25/java.lang.invoke.MethodHandle.invokeBasic(MethodHandle.java:0)
	at java.base@25/java.lang.invoke.LambdaForm$MH/sa9cc65ae.invoke_MT(LambdaForm$MH)
	at methodHandleWillFail(...)

Using the latest version of GraalVM can resolve many issues.

GraalVM Version

openjdk version "25" 2025-09-16
OpenJDK Runtime Environment GraalVM CE 25+37.1 (build 25+37-jvmci-b01)
OpenJDK 64-Bit Server VM GraalVM CE 25+37.1 (build 25+37-jvmci-b01, mixed mode, sharing)

Operating System and Version

OSX

Troubleshooting Confirmation

Run Command

just run the the code below from a native image.

Expected Behavior

I'd expect the field value to be set without an error.

Actual Behavior

java.lang.RuntimeException

Steps to Reproduce

MethodHandles.Lookup lookup = MethodHandles.lookup();
Field activeField = TestEntity.class.getDeclaredField("active");
activeField.setAccessible(true);
MethodHandle $active_fieldSetter = lookup.unreflectSetter(activeField);

TestEntity testEntity = new TestEntity();
$active_fieldSetter.invoke(testEntity, Boolean.TRUE);

// ...

public class TestEntity {

    private Long id;

    private boolean active;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public boolean isActive() {
        return active;
    }

    public void setActive(boolean active) {
        this.active = active;
    }
}

Reflection Metadata

{
      "type": "...TestEntity",
      "allPublicFields": true,
      "allDeclaredFields": true,
      "allPublicConstructors": true,
      "allDeclaredConstructors": true,
      "allPublicMethods": true,
      "allDeclaredMethods": true,
      "allPublicClasses": true,
      "allDeclaredClasses": true,
      "unsafeAllocated": true,
      "methods": [
        {
          "name": "getId",
          "parameterTypes": [ ]
        },
        {
          "name": "isActive",
          "parameterTypes": [ ]
        },
        {
          "name": "setActive",
          "parameterTypes": [
            "boolean"
          ]
        },
        {
          "name": "setId",
          "parameterTypes": [
            "java.lang.Long"
          ]
        }
      ]
    }

Additional Context

No response

Run-Time Log Output and Error Messages

No response

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions