< prev index next >

src/java.base/share/classes/java/lang/invoke/ClassSpecializer.java

Print this page

        

@@ -35,11 +35,10 @@
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
-import java.security.ProtectionDomain;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;

@@ -576,27 +575,21 @@
 
             // load class
             InvokerBytecodeGenerator.maybeDump(classBCName(className), classFile);
             Class<?> speciesCode;
 
-            ClassLoader cl = topClass().getClassLoader();
-            ProtectionDomain pd = null;
-            if (cl != null) {
-                pd = AccessController.doPrivileged(
-                        new PrivilegedAction<>() {
+            MethodHandles.Lookup lookup = IMPL_LOOKUP.in(topClass());
+            speciesCode = AccessController.doPrivileged(new PrivilegedAction<>() {
                             @Override
-                            public ProtectionDomain run() {
-                                return topClass().getProtectionDomain();
-                            }
-                        });
-            }
+                public Class<?> run() {
             try {
-                speciesCode = UNSAFE.defineClass(className, classFile, 0, classFile.length, cl, pd);
+                        return lookup.defineClass(classFile);
             } catch (Exception ex) {
                 throw newInternalError(ex);
             }
-
+                }
+            });
             return speciesCode.asSubclass(topClass());
         }
 
         // These are named like constants because there is only one per specialization scheme:
         private final String SPECIES_DATA = classBCName(metaType);
< prev index next >