You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by st...@apache.org on 2020/07/23 12:07:29 UTC

[openjpa] 05/05: OPENJPA-2821 use AsmAdapter for subclassing

This is an automated email from the ASF dual-hosted git repository.

struberg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openjpa.git

commit 94a033d83bcab3e8f00c9927533ae9889c3d11ec
Author: Mark Struberg <st...@apache.org>
AuthorDate: Thu Jul 23 14:05:56 2020 +0200

    OPENJPA-2821 use AsmAdapter for subclassing
    
    to write proper java8 code
---
 .../main/java/org/apache/openjpa/enhance/AsmAdaptor.java   | 14 ++++++++++++++
 .../org/apache/openjpa/enhance/ManagedClassSubclasser.java |  7 ++++++-
 2 files changed, 20 insertions(+), 1 deletion(-)

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 final class AsmAdaptor {
         }
     }
 
+    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 @@ public class ManagedClassSubclasser {
             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 @@ public class ManagedClassSubclasser {
             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 {