Fix #155: adjust to new proxy generator method
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user