-
Bug
-
Resolution: Fixed
-
P4
-
None
-
None
-
b17
-
x86
-
generic
The InvocationTargetException is duplicated when the invocation of a caller-sensitive method without a caller-sensitive adapter fails.
The changed behavior was introduced by https://bugs.openjdk.org/browse/JDK-8271820.
Test case:
{code}
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Main {
public int value = 10;
public static void main(String[] args) throws ReflectiveOperationException {
Field f = Main.class.getDeclaredField("value");
Method m = Field.class.getDeclaredMethod("get", Object.class);
m.invoke(f, new Object());
}
}
{code}
The InvocationTargetException stack trace on JDK 20:
{code}
Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:146)
at java.base/java.lang.reflect.Method.invoke(Method.java:578)
at Main.main(Main.java:11)
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:131)
... 2 more
Caused by: java.lang.IllegalArgumentException: Can not get int field Main.value on java.lang.Object
at java.base/jdk.internal.reflect.MethodHandleFieldAccessorImpl.newGetIllegalArgumentException(MethodHandleFieldAccessorImpl.java:86)
at java.base/jdk.internal.reflect.MethodHandleIntegerFieldAccessorImpl.getInt(MethodHandleIntegerFieldAccessorImpl.java:84)
at java.base/jdk.internal.reflect.MethodHandleIntegerFieldAccessorImpl.get(MethodHandleIntegerFieldAccessorImpl.java:55)
at java.base/java.lang.reflect.Field.get(Field.java:440)
... 3 more
{code}
The InvocationTargetException stack trace on JDK 17:
{code}
Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at Main.main(Main.java:11)
Caused by: java.lang.IllegalArgumentException: Can not set int field Main.value to java.lang.Object
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
at java.base/jdk.internal.reflect.UnsafeIntegerFieldAccessorImpl.getInt(UnsafeIntegerFieldAccessorImpl.java:56)
at java.base/jdk.internal.reflect.UnsafeIntegerFieldAccessorImpl.get(UnsafeIntegerFieldAccessorImpl.java:36)
at java.base/java.lang.reflect.Field.get(Field.java:425)
... 5 more
{code}
Expected: The InvocationTargetException should have the IllegalArgumentException as a cause.
The changed behavior was introduced by https://bugs.openjdk.org/browse/JDK-8271820.
Test case:
{code}
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Main {
public int value = 10;
public static void main(String[] args) throws ReflectiveOperationException {
Field f = Main.class.getDeclaredField("value");
Method m = Field.class.getDeclaredMethod("get", Object.class);
m.invoke(f, new Object());
}
}
{code}
The InvocationTargetException stack trace on JDK 20:
{code}
Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:146)
at java.base/java.lang.reflect.Method.invoke(Method.java:578)
at Main.main(Main.java:11)
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:131)
... 2 more
Caused by: java.lang.IllegalArgumentException: Can not get int field Main.value on java.lang.Object
at java.base/jdk.internal.reflect.MethodHandleFieldAccessorImpl.newGetIllegalArgumentException(MethodHandleFieldAccessorImpl.java:86)
at java.base/jdk.internal.reflect.MethodHandleIntegerFieldAccessorImpl.getInt(MethodHandleIntegerFieldAccessorImpl.java:84)
at java.base/jdk.internal.reflect.MethodHandleIntegerFieldAccessorImpl.get(MethodHandleIntegerFieldAccessorImpl.java:55)
at java.base/java.lang.reflect.Field.get(Field.java:440)
... 3 more
{code}
The InvocationTargetException stack trace on JDK 17:
{code}
Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at Main.main(Main.java:11)
Caused by: java.lang.IllegalArgumentException: Can not set int field Main.value to java.lang.Object
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
at java.base/jdk.internal.reflect.UnsafeIntegerFieldAccessorImpl.getInt(UnsafeIntegerFieldAccessorImpl.java:56)
at java.base/jdk.internal.reflect.UnsafeIntegerFieldAccessorImpl.get(UnsafeIntegerFieldAccessorImpl.java:36)
at java.base/java.lang.reflect.Field.get(Field.java:425)
... 5 more
{code}
Expected: The InvocationTargetException should have the IllegalArgumentException as a cause.