Anonymous classes are not final according to reflection API
Remi Forax
forax at univ-mlv.fr
Mon Jun 29 13:36:20 UTC 2015
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/27bf1d61/attachment.html>
More information about the compiler-dev
mailing list