On Wed, 26 Jul 2000, Jochen Hoenicke wrote:

> Nonfinal static fields that are initialized and "static {...}" blocks
> in the java code are compiled to a "<clinit>" constructor in bytecode.
> To calculate the serialVersionUID, classpath has to know the presence
> of this constructor.  IIRC it uses a native methods for this,  so
> check if this works for libgcj.

Bingo!  Thanks, this was it; including the <clinit> constructor in the
calculation produces the matching value to the JDK (as obtained from the
serialver utility).

Classpath calls a private static method in ObjectStreamClass
(hasClassInitializer) to check this; which in turn calls a Class method: 

        Class classArgs[] = {};
        Method m = clazz.getMethod ("<clinit>", classArgs);

which is implemented in both libgcj and Classpath as a native method.
Interestingly, a test program using the Classpath ObjectStreamClass built
with the JDK also yielded the same oversight of the <clinit> constructor
for the calculation.

Since the JDK was using it's own Class.getMethod, I suspect that the
proper fix will be in java.io.ObjectStreamClass rather than tweaking
Classpath's & libgcj's java.lang.Class.getMethod.

Thanks again for pointing this out!  It was a huge help.
--warrenl

Reply via email to