Anonymous classes are not final according to reflection API

Victor Rudometov Victor.Rudometov at oracle.com
Mon Jun 22 15:56:59 UTC 2015


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/20150622/77a7bdba/attachment-0001.html>


More information about the compiler-dev mailing list