Index: openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java =================================================================== --- openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java (revision 556794) +++ openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java (working copy) @@ -2260,7 +2260,7 @@ *
  • private static Class pcPCSuperclass *
  • *
  • private static String[] pcFieldNames
  • - *
  • private static Class[] pcFieldTypes
  • + *
  • private static String[] pcFieldTypes
  • *
  • private static byte[] pcFieldFlags
  • *
  • protected transient StateManager pcStateManager * if no PersistenceCapable superclass present)
  • @@ -2269,7 +2269,7 @@ private void addFields() { _pc.declareField(INHERIT, int.class).setStatic(true); _pc.declareField(PRE + "FieldNames", String[].class).setStatic(true); - _pc.declareField(PRE + "FieldTypes", Class[].class).setStatic(true); + _pc.declareField(PRE + "FieldTypes", String[].class).setStatic(true); _pc.declareField(PRE + "FieldFlags", byte[].class).setStatic(true); _pc.declareField(SUPER, Class.class).setStatic(true); @@ -2312,16 +2312,16 @@ } code.putstatic().setField(PRE + "FieldNames", String[].class); - // pcFieldTypes = new Class[] { .class, .class, ... }; + // pcFieldTypes = new String[] { .class, .class, ... }; code.constant().setValue(fmds.length); - code.anewarray().setType(Class.class); + code.anewarray().setType(String.class); for (int i = 0; i < fmds.length; i++) { code.dup(); code.constant().setValue(i); - code.classconstant().setClass(fmds[i].getDeclaredType()); + code.constant().setValue(fmds[i].getDeclaredType().getName()); code.aastore(); } - code.putstatic().setField(PRE + "FieldTypes", Class[].class); + code.putstatic().setField(PRE + "FieldTypes", String[].class); // pcFieldFlags = new byte[] { , , ... }; code.constant().setValue(fmds.length); @@ -2339,7 +2339,7 @@ // pcPCSuperclass, alias, new XXX ()); code.classconstant().setClass(_pc); code.getstatic().setField(PRE + "FieldNames", String[].class); - code.getstatic().setField(PRE + "FieldTypes", Class[].class); + code.getstatic().setField(PRE + "FieldTypes", String[].class); code.getstatic().setField(PRE + "FieldFlags", byte[].class); code.getstatic().setField(SUPER, Class.class); @@ -2357,7 +2357,7 @@ } code.invokestatic().setMethod(HELPERTYPE, "register", void.class, - new Class[]{ Class.class, String[].class, Class[].class, + new Class[]{ Class.class, String[].class, String[].class, byte[].class, Class.class, String.class, PCTYPE }); code.vreturn(); Index: openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCRegistry.java =================================================================== --- openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCRegistry.java (revision 556794) +++ openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCRegistry.java (working copy) @@ -20,6 +20,7 @@ import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.Map; @@ -27,6 +28,7 @@ import org.apache.openjpa.lib.util.Localizer; import org.apache.openjpa.lib.util.ReferenceMap; import org.apache.openjpa.lib.util.concurrent.ConcurrentReferenceHashMap; +import org.apache.openjpa.util.InternalException; import org.apache.openjpa.util.UserException; /** @@ -44,6 +46,19 @@ // map of pc classes to meta structs; weak so the VM can GC classes private static final Map _metas = new ConcurrentReferenceHashMap (ReferenceMap.WEAK, ReferenceMap.HARD); + + private static final Map _primitives = new HashMap(); + static { + _primitives.put("boolean", boolean.class); + _primitives.put("byte", byte.class); + _primitives.put("char", char.class); + _primitives.put("double", double.class); + _primitives.put("float", float.class); + _primitives.put("int", int.class); + _primitives.put("long", long.class); + _primitives.put("short", short.class); + } + // register class listeners private static final Collection _listeners = new LinkedList(); @@ -88,8 +103,29 @@ */ public static Class[] getFieldTypes(Class pcClass) { Meta meta = getMeta(pcClass); - return meta.fieldTypes; + String[] fieldTypes = meta.fieldTypes; + Class[] result = new Class[fieldTypes.length]; + ClassLoader fieldLoader = pcClass.getClassLoader(); + for (int i=0; iPersistenceCapable @@ -185,7 +221,7 @@ * @param pc an instance of the class, if not abstract */ public static void register(Class pcClass, String[] fieldNames, - Class[] fieldTypes, byte[] fieldFlags, Class sup, String alias, + String[] fieldTypes, byte[] fieldFlags, Class sup, String alias, PersistenceCapable pc) { if (pcClass == null) throw new NullPointerException(); @@ -243,12 +279,12 @@ public final PersistenceCapable pc; public final String[] fieldNames; - public final Class[] fieldTypes; + public final String[] fieldTypes; public final Class pcSuper; public final String alias; public Meta(PersistenceCapable pc, String[] fieldNames, - Class[] fieldTypes, Class pcSuper, String alias) { + String[] fieldTypes, Class pcSuper, String alias) { this.pc = pc; this.fieldNames = fieldNames; this.fieldTypes = fieldTypes; Index: openjpa-kernel/src/main/resources/org/apache/openjpa/enhance/localizer.properties =================================================================== --- openjpa-kernel/src/main/resources/org/apache/openjpa/enhance/localizer.properties (revision 556794) +++ openjpa-kernel/src/main/resources/org/apache/openjpa/enhance/localizer.properties (working copy) @@ -121,3 +121,5 @@ field "{1}", while the getter method returns field "{2}". cft-exception-thrown: An exception was thrown while attempting to perform \ class file transformation on "{0}": +field-type-load-error: Following exception was thrown while "{3}" tried to \ + load the class "{2}" declared as the type of "{0}.{1}": {4}