db-jdo-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ilan Kirsh <ki...@objectdb.com>
Subject Re: class loading issue when super class has reference to sub class
Date Sun, 25 Jun 2006 12:19:06 GMT
Sounds good to me, assuming that this does solve the exception in JPox.

Ilan

----- Original Message ----- 
From: "Craig L Russell" <Craig.Russell@Sun.COM>
Cc: "JDO Expert Group" <jdo-experts-ext@Sun.COM>; "Apache JDO project" 
<jdo-dev@db.apache.org>
Sent: Sunday, June 25, 2006 1:06 AM
Subject: Re: class loading issue when super class has reference to sub class


> 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