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

Caused by: java.lang.UnsupportedOperationException during annotation processing

XMLWordPrintable

    • x86_64
    • linux

      FULL PRODUCT VERSION :


      ADDITIONAL OS VERSION INFORMATION :
      uname -a
      Linux petar-XPS-15-9550 4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

      A DESCRIPTION OF THE PROBLEM :
      With the latest java9 or java10 I get java.lang.UnsupportedOperationException when I try to compile my code (the compiler invokes annotation processor). My annotation processor has this method:

          protected <T> T getAnnotationMember(AnnotationMirror annotation, String member) {
              return processingEnv.getElementUtils().getElementValuesWithDefaults(annotation).entrySet().stream().filter(
                              e -> Objects.equals(member, e.getKey().getSimpleName().toString())).map(element -> {
                  @SuppressWarnings("unchecked")
                  T value = (T) element.getValue().getValue(); //--------> EXCEPTION HAPPENS HERE!!!!
                  return value;
              }).findFirst().orElseThrow(
                              () -> new IllegalArgumentException(String.format("Member '%s' not found in mirror for annotation [%s]", member, annotation)));
          }


      which used the processingEnv to find all elements that have this annotation:

          @interface GeneratorFilter {
              /**
               * Exclude code generator classes such that will not be applied by the processor.
               *
               * @return the generators to exclude.
               */
              Class<? extends CodeGenerator>[] exclude() default {};

              /**
               * Include code generator classes even when not registered as a service.
               *
               * @return the generators to include.
               */
              Class<? extends CodeGenerator>[] include() default {};

          }


      and then I try to get the value of the "exclude" attribute. Now this code:

       T value = (T) element.getValue().getValue();

      has the following meaning:
      1) Java9 or Java10
       - element: LinkedHashMap$Entry ("exclude()" -> "{}")
       - element.getValue(): ClassReader$ArrayAttributeProxy ({})
       - element.getValue().getValue() -> Throws UnsupportedOperationException

      2) Java8
       - element: LinkedHashMap$Entry("exclude()" -> "{}")
       - element.getValue(): Attribute$Array({})
       - element.getValue().getValue(): List(size=0)



      REGRESSION. Last worked in version 8u172

      ADDITIONAL REGRESSION INFORMATION:
      $>java -version
      java version "1.8.0_161"
      Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
      Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

      ACTUAL -
      java.lang.UnsupportedOperationException

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      Caused by: java.lang.UnsupportedOperationException
      at jdk.compiler/com.sun.tools.javac.code.Attribute.getValue(Attribute.java:58)
      at com.nemesis.platform.core.mixin.processor.AbstractMixInAnnotationProcessor.lambda$getAnnotationMember$2(AbstractMixInAnnotationProcessor.java:89)
      at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
      at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
      at java.base/java.util.Spliterators$IteratorSpliterator.tryAdvance(Spliterators.java:1812)
      at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
      at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
      at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
      at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
      at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
      at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
      at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:543)
      at com.nemesis.platform.core.mixin.processor.AbstractMixInAnnotationProcessor.getAnnotationMember(AbstractMixInAnnotationProcessor.java:91)
      at com.nemesis.platform.core.mixin.processor.AbstractMixInAnnotationProcessor.loadCodeGenerators(AbstractMixInAnnotationProcessor.java:161)
      at com.nemesis.platform.core.mixin.processor.AbstractMixInAnnotationProcessor.findAndProcessMixIns(AbstractMixInAnnotationProcessor.java:130)
      at com.nemesis.platform.core.mixin.processor.AbstractMixInAnnotationProcessor.process(AbstractMixInAnnotationProcessor.java:58)
      at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:964)
      at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:881)
      at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.access$2100(JavacProcessingEnvironment.java:110)
      at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1202)
      at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1311)
      at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1250)
      at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:928)
      at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:100)
      at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.handleExceptions(JavacTaskImpl.java:142)

      REPRODUCIBILITY :
      This bug can be reproduced always.

            fmatte Fairoz Matte
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated:
              Resolved: