Hi,

I experimented with classes where I manually added the code that is generated by the enhancer. I could reproduce the class loading issue only with jdk1.4. I do not get an exception when compiling and running the classes with jdk 1.5. I can confirm that replacing the expression jdoFieldNames.length by a constant in the implementation of jdoGetManagedFieldCount solves the problem.

Regards Michael
You can still call <pc-superclass>.jdoGetManagedFieldCount()
(so the super class may be changed without recompiling the subclass)
just replace the jdoFieldNames.length component with a constant.

Ilan


----- Original Message ----- From: "Erik Bengtson" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>; <[email protected]>
Sent: Sunday, June 25, 2006 12:55 PM
Subject: Re: class loading issue when super class has reference to sub class


Thanks Ilan,

I will do this way them, but this requires users to recompile and
reenhance
child classes if super classes are changed.

Regards,

Erik Bengtson
Quoting Ilan Kirsh <[EMAIL PROTECTED]>:

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
calculated
at enhancement time. Hopefully this change should do the difference.

Regards,

Ilan

----- Original Message -----
From: "Erik Bengtson" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>; <[email protected]>
Sent: Saturday, June 24, 2006 11:15 PM
Subject: class loading issue when super class has reference to sub class


> Hi,
>
> There is an issue when initialising a class when super class has
> reference
> to
> sub 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;
> }
>
>
>












--
Michael Bouschen                [EMAIL PROTECTED] Engineering GmbH
mailto:[EMAIL PROTECTED]        http://www.tech.spree.de/
Tel.:++49/30/235 520-33         Buelowstr. 66
Fax.:++49/30/2175 2012          D-10783 Berlin

Reply via email to