aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/javassist/util/proxy/DefineClassHelper.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/javassist/util/proxy/DefineClassHelper.java')
-rw-r--r--src/main/javassist/util/proxy/DefineClassHelper.java21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/main/javassist/util/proxy/DefineClassHelper.java b/src/main/javassist/util/proxy/DefineClassHelper.java
index 3ed261e5..4d6c9f9d 100644
--- a/src/main/javassist/util/proxy/DefineClassHelper.java
+++ b/src/main/javassist/util/proxy/DefineClassHelper.java
@@ -21,6 +21,7 @@ import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodHandles.Lookup;
import java.lang.reflect.Method;
import java.security.ProtectionDomain;
+import java.util.List;
import javassist.CannotCompileException;
import javassist.bytecode.ClassFile;
@@ -73,8 +74,12 @@ public class DefineClassHelper
throw new IllegalAccessError("Access denied for caller.");
try {
SecurityActions.TheUnsafe usf = SecurityActions.getSunMiscUnsafeAnonymously();
+ List<Method> defineClassMethod = usf.methods.get("defineClass");
+ // On Java 11+ the defineClass method does not exist anymore
+ if (null == defineClassMethod)
+ return null;
MethodHandle meth = MethodHandles.lookup()
- .unreflect(usf.methods.get("defineClass").get(0));
+ .unreflect(defineClassMethod.get(0));
return new ReferencedUnsafe(usf, meth);
} catch (Throwable e) {
throw new RuntimeException("cannot initialize", e);
@@ -171,11 +176,15 @@ public class DefineClassHelper
ClassLoader loader, ProtectionDomain protectionDomain) throws ClassFormatError;
}
- private static final SecuredPrivileged privileged = ClassFile.MAJOR_VERSION >= ClassFile.JAVA_9
- ? SecuredPrivileged.JAVA_9
- : ClassFile.MAJOR_VERSION >= ClassFile.JAVA_7
- ? SecuredPrivileged.JAVA_7
- : SecuredPrivileged.JAVA_OTHER;
+ // Java 11+ removed sun.misc.Unsafe.defineClass, so we fallback to invoking defineClass on
+ // ClassLoader until we have an implementation that uses MethodHandles.Lookup.defineClass
+ private static final SecuredPrivileged privileged = ClassFile.MAJOR_VERSION > ClassFile.JAVA_10
+ ? SecuredPrivileged.JAVA_OTHER
+ : ClassFile.MAJOR_VERSION >= ClassFile.JAVA_9
+ ? SecuredPrivileged.JAVA_9
+ : ClassFile.MAJOR_VERSION >= ClassFile.JAVA_7
+ ? SecuredPrivileged.JAVA_7
+ : SecuredPrivileged.JAVA_OTHER;
/**
* Loads a class file by a given class loader.