db-jdo-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Craig L Russell <Craig.Russ...@Sun.COM>
Subject Re: class loading issue when super class has reference to sub class
Date Sat, 24 Jun 2006 23:06:37 GMT
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  
> calculated
> at 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 jdoGetManagedFieldCount
The 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" <erik@jpox.org>
> To: <jdo-experts-ext@sun.com>; <jdo-dev@db.apache.org>
> 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;
>> }
>>
>>
>
>

Craig Russell
Architect, Sun Java Enterprise System http://java.sun.com/products/jdo
408 276-5638 mailto:Craig.Russell@sun.com
P.S. A good JDO? O, Gasp!


Mime
View raw message