Fix #155: adjust to new proxy generator method

This commit is contained in:
Andy Clement
2016-06-24 17:10:51 -07:00
parent 7d3decea39
commit 658a8678a6
2 changed files with 37 additions and 4 deletions

View File

@@ -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);
}

View File

@@ -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);
}
}
}