RFR 8159751: ObjectStreamClass: hide 'final' flag for anonymous classes

Roger Riggs Roger.Riggs at Oracle.com
Thu Jun 23 14:51:57 UTC 2016


Hi Dan,

Is setting ACC_FINAL for anonymous inner classes a unique feature of the 
latest bytecode version?
(javac -target 9)

Was it always clear in class files with earlier bytecode versions?

Thanks, Roger


On 6/22/2016 7:05 PM, Dan Smith wrote:
> Hi, making a change to serialization's computation of UID in order to avoid taking ACC_FINAL into account for anonymous inner classes.  Will also change the Serialization Specification.
>
> https://bugs.openjdk.java.net/browse/JDK-8159751
>
> The patch is small, inline below.  Not sure about the best testing strategy, but I decided to add a test that compares to a precomputed magic number.  I verified that this test fails after modifying javac (per JDK-8129576), but then succeeds after applying the change to ObjectStreamClass.  (I won't actually push JDK-8129576 until this is pushed, though.)
>
> —Dan
>
> # HG changeset patch
> # Parent 7e7f37ae1a6d76c0374b0dc46709d8fde25456b1
> diff -r 7e7f37ae1a6d -r f468e80bcd51 src/java.base/share/classes/java/io/ObjectStreamClass.java
> --- a/src/java.base/share/classes/java/io/ObjectStreamClass.java	Tue Jun 21 15:15:05 2016 -0700
> +++ b/src/java.base/share/classes/java/io/ObjectStreamClass.java	Wed Jun 22 16:59:00 2016 -0600
> @@ -1708,6 +1708,14 @@
>                    Modifier.INTERFACE | Modifier.ABSTRACT);
>   
>               /*
> +             * compensate for anonymous classes which have historically
> +             * not been marked ACC_FINAL
> +             */
> +            if ((classMods & Modifier.FINAL) != 0 && cl.isAnonymousClass()) {
> +                classMods = classMods & ~Modifier.FINAL;
> +            }
> +
> +            /*
>                * compensate for javac bug in which ABSTRACT bit was set for an
>                * interface only if the interface declared methods
>                */
> diff -r 7e7f37ae1a6d -r f468e80bcd51 test/java/io/ObjectInputStream/AnonymousClassUID.java
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/test/java/io/ObjectInputStream/AnonymousClassUID.java	Wed Jun 22 16:59:00 2016 -0600
> @@ -0,0 +1,45 @@
> +/*
> + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
> + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
> + *
> + * This code is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License version 2 only, as
> + * published by the Free Software Foundation.
> + *
> + * This code is distributed in the hope that it will be useful, but WITHOUT
> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
> + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
> + * version 2 for more details (a copy is included in the LICENSE file that
> + * accompanied this code).
> + *
> + * You should have received a copy of the GNU General Public License version
> + * 2 along with this work; if not, write to the Free Software Foundation,
> + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
> + *
> + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
> + * or visit www.oracle.com if you need additional information or have any
> + * questions.
> + */
> +
> +import java.io.ObjectStreamClass;
> +import java.io.Serializable;
> +
> +/*
> + * @test
> + * @bug 8159751
> + * @summary Ensure that an anonymous inner class has a stable UID
> + */
> +public class AnonymousClassUID {
> +
> +    public static void main(String[] args) {
> +        Class<?> c = new Serializable() {
> +            int x = 0;
> +            public String m(Object arg) { return null; }
> +            public int m(Class<String> arg) { return 1; }
> +        }.getClass();
> +        long uid = ObjectStreamClass.lookup(c).getSerialVersionUID();
> +        long expectedUID = -8213874395645447803L;
> +        if (uid != expectedUID) throw new AssertionError("Unexpected UID: " + uid);
> +    }
> +
> +}



More information about the core-libs-dev mailing list