--- old/test/hotspot/jtreg/runtime/cds/appcds/test-classes/Util.java 2019-08-09 10:19:54.448163716 -0700 +++ new/test/hotspot/jtreg/runtime/cds/appcds/test-classes/Util.java 2019-08-09 10:19:53.747138253 -0700 @@ -23,21 +23,24 @@ */ import java.io.*; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodHandles.Lookup; +import static java.lang.invoke.MethodHandles.*; import java.lang.reflect.*; import java.util.jar.*; public class Util { /** - * Invoke the loader.defineClass() class method to define the class stored in clsFile, + * Invoke the lookup.defineClass() class method to define the class stored in clsFile, * with the following modification: * */ - public static Class defineModifiedClass(ClassLoader loader, File clsFile, String fromString, String toString) + public static Class defineModifiedClass(ClassLoader loader, File clsFile, String fromString, String toString) throws FileNotFoundException, IOException, NoSuchMethodException, IllegalAccessException, - InvocationTargetException + InvocationTargetException, ClassNotFoundException { try (DataInputStream dis = new DataInputStream(new FileInputStream(clsFile))) { byte[] buff = new byte[(int)clsFile.length()]; @@ -46,14 +49,13 @@ System.out.println("Loading from: " + clsFile + " (" + buff.length + " bytes)"); - Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", - buff.getClass(), int.class, int.class); - defineClass.setAccessible(true); - // We directly call into ClassLoader.defineClass() to define the "Super" class. Also, + // We directly call into Lookup.defineClass() to define the "Super" class. Also, // rewrite its classfile so that it returns ___yyy___ instead of ___xxx___. Changing the // classfile will guarantee that this class will NOT be loaded from the CDS archive. - Class cls = (Class)defineClass.invoke(loader, buff, new Integer(0), new Integer(buff.length)); + Class target = Class.forName("Hello", false, loader); + Lookup lookup = privateLookupIn(target, lookup()); + Class cls = lookup.defineClass(buff); System.out.println("Loaded : " + cls); return cls; @@ -107,12 +109,12 @@ public static Class defineClassFromJAR(ClassLoader loader, File jarFile, String className) throws FileNotFoundException, IOException, NoSuchMethodException, IllegalAccessException, - InvocationTargetException { + InvocationTargetException, ClassNotFoundException { return defineClassFromJAR(loader, jarFile, className, null, null); } /** - * Invoke the loader.defineClass() class method to define the named class stored in a JAR file. + * Invoke the lookup.defineClass() class method to define the named class stored in a JAR file. * * If a class exists both in the classpath, as well as in the list of URLs of a URLClassLoader, * by default, the URLClassLoader will not define the class, and instead will delegate to the @@ -121,10 +123,10 @@ * Optionally, you can modify the contents of the classfile buffer. See comments in * defineModifiedClass. */ - public static Class defineClassFromJAR(ClassLoader loader, File jarFile, String className, + public static Class defineClassFromJAR(ClassLoader loader, File jarFile, String className, String fromString, String toString) throws FileNotFoundException, IOException, NoSuchMethodException, IllegalAccessException, - InvocationTargetException + InvocationTargetException, ClassNotFoundException { byte[] buff = getClassFileFromJar(jarFile, className); @@ -134,10 +136,9 @@ //System.out.println("Loading from: " + ent + " (" + buff.length + " bytes)"); - Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", - buff.getClass(), int.class, int.class); - defineClass.setAccessible(true); - Class cls = (Class)defineClass.invoke(loader, buff, new Integer(0), new Integer(buff.length)); + Class target = Class.forName("Hello", false, loader); + Lookup lookup = privateLookupIn(target, lookup()); + Class cls = lookup.defineClass(buff); //System.out.println("Loaded : " + cls); return cls; @@ -153,4 +154,5 @@ return buff; } } + }