From 658a8678a672d24e9528fb63f70fa502ca7341ea Mon Sep 17 00:00:00 2001 From: Andy Clement Date: Fri, 24 Jun 2016 17:10:51 -0700 Subject: [PATCH] Fix #155: adjust to new proxy generator method --- .../springsource/loaded/ReloadableType.java | 6 ++-- .../java/org/springsource/loaded/Utils.java | 35 +++++++++++++++++++ 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/springloaded/src/main/java/org/springsource/loaded/ReloadableType.java b/springloaded/src/main/java/org/springsource/loaded/ReloadableType.java index d0fea4d..c2912f0 100644 --- a/springloaded/src/main/java/org/springsource/loaded/ReloadableType.java +++ b/springloaded/src/main/java/org/springsource/loaded/ReloadableType.java @@ -612,10 +612,8 @@ public class ReloadableType { if (relevantProxies != null) { for (ReloadableType relevantProxy : relevantProxies) { Class[] interfacesImplementedByProxy = relevantProxy.getClazz().getInterfaces(); - // check slashedname correct - // @SuppressWarnings("restriction") - byte[] newProxyBytes = sun.misc.ProxyGenerator.generateProxyClass( - relevantProxy.getSlashedName(), + // TODO confirm slashedname correct + byte[] newProxyBytes = Utils.generateProxyClass(relevantProxy.getSlashedName(), interfacesImplementedByProxy); relevantProxy.loadNewVersion(versionsuffix, newProxyBytes, true); } diff --git a/springloaded/src/main/java/org/springsource/loaded/Utils.java b/springloaded/src/main/java/org/springsource/loaded/Utils.java index a79c0e5..22ed787 100644 --- a/springloaded/src/main/java/org/springsource/loaded/Utils.java +++ b/springloaded/src/main/java/org/springsource/loaded/Utils.java @@ -44,6 +44,7 @@ import org.objectweb.asm.tree.AnnotationNode; import org.objectweb.asm.tree.FieldNode; import org.springsource.loaded.Utils.ReturnType.Kind; +import sun.misc.ProxyGenerator; // TODO debugging tests - how is the experience? rewriting of field accesses will really // affect field navigation in the debugger @@ -1935,4 +1936,38 @@ public class Utils implements Opcodes, Constants { cr.accept(v, 0); return v.classname; } + + private static boolean checkedForNewProxyGenerateMethod = false; + + private static Method newProxyGenerateMethod; + + public static byte[] generateProxyClass(String slashedName, Class[] interfacesImplementedByProxy) { + if (!checkedForNewProxyGenerateMethod) { + checkedForNewProxyGenerateMethod = true; + try { + newProxyGenerateMethod = ProxyGenerator.class.getDeclaredMethod("generateProxyClass", String.class, + Class[].class, Integer.TYPE); + } + catch (NoSuchMethodException nsme) { + // That's fine, we are early Java8 or before + } + } + if (newProxyGenerateMethod != null) { + try { + newProxyGenerateMethod.setAccessible(true); + byte[] bytes = (byte[]) newProxyGenerateMethod.invoke(null, slashedName, interfacesImplementedByProxy, + (Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL)); + return bytes; + } + catch (Exception e) { + // Unexpected + throw new RuntimeException("Unexpected exception calling proxy generator ", e); + } + } + else { + return sun.misc.ProxyGenerator.generateProxyClass( + slashedName, + interfacesImplementedByProxy); + } + } }