Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8304585

Method::invoke rewraps InvocationTargetException if a caller-sensitive method throws IAE

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: P4 P4
    • 21
    • None
    • core-libs
    • None

      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.

            mchung Mandy Chung (Inactive)
            tzezula Tomáš Zezula
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated:
              Resolved: