On Fri, 19 Mar 2021 14:34:00 GMT, Rafael Winterhalter 
<winterhal...@openjdk.org> wrote:

>> A general comment, the enum constructor situation is a bit tricky as
>> 
>> 1) There is no 100% reliable way to determine which of a enum constructor's 
>> args are synthetic.
>> 
>> 2) How a Java compiler generates enum constructors is a compiler-internal 
>> contract since all the enum constructors must be private.
>> 
>> It is true that javac has consistently added two extra parameters as an 
>> implementation detail. Offhand, I don't know if ecj in particular has made 
>> the same choice. javac is not obliged to continue implementing enum 
>> constructors in this manner, so for better robustness, I think a fix in this 
>> space needs to be able to accommodate situations other than exactly N+2 
>> parameters.
>
> *ejc* issues the same constructor that prefixes a `String` and an `int` 
> parameter. I agree that the solution is not perfect, but I would prefer it 
> over the reflection API throwing an `IndexOutOfBoundsException` upon calling 
> `getAnnotations()`, which nobody really expects upon a getter invocation.
> 
> I added a check to see if the enum constructor in question starts with a 
> `String` and `int` parameter after checking if there are two excess 
> parameters. I believe that that's at least an improvement over today's state 
> where it's very unlikely that an enum constructor  yields an incorrect result 
> in the reflection API whereas the result it is always incorrect today, given 
> the implementation of both *ejc* and *javac*.
> 
> Ideally, this would of course also be fixed by javac (and ejc) such that the 
> annotations are placed on the correct indices, but I still argue that the fix 
> is an improvement for being able to properly process enum constructors for 
> older class files also.

@raphw a duplicate? https://bugs.openjdk.java.net/browse/JDK-8246586

-------------

PR: https://git.openjdk.java.net/jdk/pull/3082

Reply via email to