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

Annotations with lambda expressions cause "java.lang.annotation.AnnotationFormatError: Malformed method on an annotation type"

    Details

    • Subcomponent:
    • CPU:
      generic
    • OS:
      generic

      Description

      FULL PRODUCT VERSION :
      java version "1.8.0_112"
      Java(TM) SE Runtime Environment (build 1.8.0_112-b15)
      Java HotSpot(TM) 64-Bit Server VM (build 25.112-b15, mixed mode)

      java version "9-ea"
      Java(TM) SE Runtime Environment (build 9-ea+144)
      Java HotSpot(TM) 64-Bit Server VM (build 9-ea+144, mixed mode)

      A DESCRIPTION OF THE PROBLEM :
      I'm a developer of the JaCoCo code coverage library.
      While preparing test cases for instrumentation of annotations, I encountered this issue and isolated a simple reproducer.


      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Compile and start the source code below.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      No exception
      ACTUAL -
      java.lang.annotation.AnnotationFormatError: Malformed method on an annotation type
              at sun.reflect.annotation.AnnotationInvocationHandler.validateAnnotationMethods(AnnotationInvocationHandler.java:384)

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      import java.lang.annotation.Retention;
      import java.lang.annotation.RetentionPolicy;
      import java.lang.reflect.Method;

      class AnnotationBug {
        @Retention(RetentionPolicy.RUNTIME)
        @interface Annotation {
          // provoke creation of method
          Runnable r = () -> {};
        }

        @Annotation
        public static void m1() {
        }

        @Annotation
        public static void m2() {
        }

        @Annotation
        public static void main(String[] args) throws Exception {
          Annotation a1 = AnnotationBug.class.getMethod("m1").getAnnotation(Annotation.class);
          Annotation a2 = AnnotationBug.class.getMethod("m2").getAnnotation(Annotation.class);
          // provoke verification in AnnotationInvocationHandler
          a1.equals(a2);
        }
      }
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      Don't test wired corner cases ;-)

        Attachments

          Activity

            People

            • Assignee:
              darcy Joe Darcy
              Reporter:
              webbuggrp Webbug Group
            • Votes:
              0 Vote for this issue
              Watchers:
              8 Start watching this issue

              Dates

              • Created:
                Updated: