Hi Dan,
I was concerned about inter-operation between versions because
serialized objects
are passed between Java runtimes with different versions and both need
to compute
the same serial version uid (if it is not explicitly declared). The
older java runtimes will
compute the serial version uid without regard to your change.
If javac always turns on the ACC_FINAL bit and using -target 8 and then
the class file
is executed in a Java 8 runtime, it seems like it would compute a
different value
which would be in compatible change. It might be safer to introduce
this change
only with the new class file version number.
Roger
On 6/23/2016 12:55 PM, Dan Smith wrote:
On Jun 23, 2016, at 8:51 AM, Roger Riggs <roger.ri...@oracle.com> wrote:
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?
This is a choice that the compiler makes, subject to the constraints of the
Language Specification. At the moment, ACC_FINAL does not get set*. The
outcome I expect from JDK-8129576 is to always set it, regardless of target
version, since that's what the spec has always said. I suppose we could
consider guarding the change on target version, but anyway that wouldn't affect
the behavior of serialization either way, since this patch causes it to always
ignore ACC_FINAL.
(* Actually, we found a bug in which it sometimes gets set on the class's
flags, but still remains unset in the flags provided by the InnerClasses
attribute. The latter is what you get from Class.getModifiers, so this bug
hasn't affected serialization.)
—Dan