Hi Ilan, On Jun 24, 2006, at 4:32 PM, Ilan Kirsh wrote:
Hi Erik, I remember similar problems with this enhanced method in the past so I just checked your test with ObjectDB, but now it works well with no exception.The code that is produced by the ObjectDB Enhancer is slightly different and instead of jdoFieldNames.length there is a constant that is calculatedat enhancement time. Hopefully this change should do the difference.
Please note that there is a difference between what the spec requires in terms of the semantics and what the sample code shows as an implementation. The sample code in 21.21 is not normative.
The spec requires: protected static int jdoGetManagedFieldCount();This method returns the number of managed fields declared by this class plus the number inherited from all superclasses. This method is generated in the class to allow the class to determine at runtime the number of inherited fields, without having introspection code in
the enhanced class. The sample code for Employee in section 21.21 is: 21.21.7 Generated jdoGetManagedFieldCountThe generated method returns the number of managed fields in this class plus the number of inherited managed fields. This method is expected to be executed only during class
loading of the subclasses.
The implementation for topmost classes in the hierarchy:
protected static int jdoGetManagedFieldCount () {
return jdoFieldNames.length;
}
The implementation for subclasses:
protected static int jdoGetManagedFieldCount () {
return <pc-superclass>.jdoGetManagedFieldCount() +
jdoFieldNames.length;
}
So it looks like we could improve the example code by replacing the
jdoFieldNames.length with an unnamed constant (which does not require
that the jdoFieldNames field be initialized).
Craig
Regards, Ilan ----- Original Message ----- From: "Erik Bengtson" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]>; <[email protected]> Sent: Saturday, June 24, 2006 11:15 PMSubject: class loading issue when super class has reference to sub classHi,There is an issue when initialising a class when super class has reference tosub class(Cclass extending Bclass extending Aclass and Aclass has a reference to Cclass)public class Aclass { private Cclass cclass; } public class Bclass extends Aclass { } public class Cclass extends Bclass { } public class Main { public static void main(String[] args) throws Exception { //The following line throws ExceptionInInitializerError caused by java.lang.NullPointerException System.out.println(Class.forName("org.jpox.test.Bclass")); } } Exception in thread "main" java.lang.ExceptionInInitializerError at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at org.jpox.test.Aclass.___jdo$loadClass(Aclass.java) at org.jpox.test.Aclass.__jdoFieldTypesInit(Aclass.java) at org.jpox.test.Aclass.<clinit>(Aclass.java) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at org.jpox.test.Main.main(Main.java:6) Caused by: java.lang.NullPointerException at org.jpox.test.Bclass.jdoGetManagedFieldCount(Bclass.java) at org.jpox.test.Cclass.__jdoGetInheritedFieldCount(Cclass.java) at org.jpox.test.Cclass.<clinit>(Cclass.java) ... 8 more See for a diagram http://www.jpox.org/servlet/jira/browse/ENHANCER-58 The issue is due to the implementation of the jdoGetManagedFieldCount The implementation for topmost classes in the hierarchy: protected static int jdoGetManagedFieldCount () { return jdoFieldNames.length; } The implementation for subclasses: protected static int jdoGetManagedFieldCount () { return <pc-superclass>.jdoGetManagedFieldCount() + jdoFieldNames.length; }
Craig Russell Architect, Sun Java Enterprise System http://java.sun.com/products/jdo 408 276-5638 mailto:[EMAIL PROTECTED] P.S. A good JDO? O, Gasp!
smime.p7s
Description: S/MIME cryptographic signature
