-
Bug
-
Resolution: Incomplete
-
P3
-
None
-
9.0.4
-
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.
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.