Anonymous classes are not final according to reflection API

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Mon Jun 29 13:49:50 UTC 2015


More specifically, I was talking about this related issue:

https://bugs.openjdk.java.net/browse/JDK-8130032

Popping back one level, I think the issue you are seeing there, is that 
ACC_FINAL is erroneosuly set by javac for diamond anon classes. This 
seems to be against all the documentation that can be found on JBS = 
example:

https://bugs.openjdk.java.net/browse/JDK-8023945

I seem to be able to get javac spit out ACC_FINAL reliably on JDK 7/8/9 
- so the question is - when did it come back? Was it deliberate? If so, 
was reflection ever updated to handle this?

Maurizio

On 29/06/15 14:36, Remi Forax wrote:
> yes, right,
> it seems to be a backward compatibility land of mines.
>
> Rémi
>
> On 06/29/2015 03:29 PM, Maurizio Cimadamore wrote:
>> I've closed it as 'not an issue' - this seems to be an outstanding 
>> issue that was fixed for some time and then reverted because of 
>> compatibility problems:
>>
>> https://bugs.openjdk.java.net/browse/JDK-6520152
>>
>> Maurizio
>>
>> On 23/06/15 14:42, Georgiy Rakov wrote:
>>> I've filed the issue JDK-8129576. 
>>> <https://bugs.openjdk.java.net/browse/JDK-8129576>
>>>
>>> There is following issue in JBS: JDK-4777101 
>>> <https://bugs.openjdk.java.net/browse/JDK-4777101> which seems to 
>>> relate to this one.
>>>
>>> Thank you,
>>> Georgiy.
>>>
>>> On 22.06.2015 18:56, Victor Rudometov wrote:
>>>> This seems to be a reflection bug, since ACC_FINAL is present in 
>>>> Test12$1.class file:
>>>>
>>>> final class test.Test12$1 extends test.Test12$Foo<java.lang.Integer>
>>>>   minor version: 0
>>>>   major version: 52
>>>>   flags: ACC_FINAL, ACC_SUPER
>>>>
>>>> Thanks.
>>>> Victor.
>>>>
>>>> On 22-Jun-15 18:35, Remi Forax wrote:
>>>>> I wonder if it's not a reflection bug,
>>>>> did you check with 'javap -c -verbose' the modifiers of the 
>>>>> generated class (something like Test12$1.class) ?
>>>>>
>>>>> cheers,
>>>>> Rémi
>>>>>
>>>>> On 06/22/2015 05:17 PM, Georgiy Rakov wrote:
>>>>>> Hello,
>>>>>>
>>>>>> if I understand correctly according to following assertion from 
>>>>>> JLS 15.9.5 anonymous classes are always final:
>>>>>>
>>>>>>     An anonymous class is always implicitly final (§8.1.1.2).
>>>>>>
>>>>>> But reflection API reports that the class is not final. Namely 
>>>>>> let's consider following code:
>>>>>>
>>>>>>     import java.lang.reflect.Modifier;
>>>>>>
>>>>>>     public class Test12 {
>>>>>>         static class Foo<T> {}
>>>>>>
>>>>>>         public static void main(String argv[]) {
>>>>>>             Foo<Integer> foo = new Foo<>() {};
>>>>>>             if ( (foo.getClass().getModifiers() & Modifier.FINAL)
>>>>>>     != 0 ) {
>>>>>>                 System.out.println("final, modifiers: " +
>>>>>>     foo.getClass().getModifiers());
>>>>>>             } else {
>>>>>>                 System.out.println("not final, modifiers: " +
>>>>>>     foo.getClass().getModifiers());
>>>>>>             }
>>>>>>         }
>>>>>>     }
>>>>>>
>>>>>> On JDK9b69 it reports:
>>>>>>
>>>>>>     not final, modifiers: 0
>>>>>>
>>>>>> Could you please tell if you consider this as a discrepancy 
>>>>>> between spec and javac (VM?) which should be fixed.
>>>>>>
>>>>>> Thank you,
>>>>>> Georgiy.
>>>>>
>>>>
>>>
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20150629/179b52db/attachment.html>


More information about the compiler-dev mailing list