OPENJPA-2821 use AsmAdapter for subclassing
to write proper java8 code
diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/AsmAdaptor.java b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/AsmAdaptor.java
index 7bef1ef..6bb26d9 100644
--- a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/AsmAdaptor.java
+++ b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/AsmAdaptor.java
@@ -81,6 +81,20 @@
}
}
+ public static void write(BCClass bc, OutputStream os) throws IOException {
+ if (bc.getMajorVersion() < Java7_MajorVersion) {
+ bc.write(os);
+ }
+ else {
+ try {
+ writeJava7(bc, os);
+ } finally {
+ os.flush();
+ os.close();
+ }
+ }
+ }
+
public static byte[] toByteArray(BCClass bc, byte[] returnBytes) throws IOException {
if (bc.getMajorVersion() >= Java7_MajorVersion) {
returnBytes = toJava7ByteArray(bc, returnBytes);
diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ManagedClassSubclasser.java b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ManagedClassSubclasser.java
index fab02ab..0a7d376 100644
--- a/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ManagedClassSubclasser.java
+++ b/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ManagedClassSubclasser.java
@@ -18,6 +18,7 @@
*/
package org.apache.openjpa.enhance;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
@@ -142,6 +143,8 @@
if (redefine) {
enhancer.setRedefine(true);
}
+
+ // we need to create subclasses because class retransform doesn't allow to change the interfaces of a previously loaded class
enhancer.setCreateSubclass(true);
enhancer.setAddDefaultConstructor(true);
@@ -276,7 +279,9 @@
if (enhancer.isAlreadyRedefined())
ints.add(bc.getType());
else {
- map.put(bc.getType(), bc.toByteArray());
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ AsmAdaptor.write(bc, baos);
+ map.put(bc.getType(), baos.toByteArray());
debugBytecodes(bc);
}
} else {