-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Open
Labels
Description
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.
- I tried with the latest version of GraalVM.
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
- I tried the suggestions in the troubleshooting guide.
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
RobMaskell