< prev index next >
test/hotspot/jtreg/runtime/cds/appcds/test-classes/Util.java
Print this page
*** 21,61 ****
* questions.
*
*/
import java.io.*;
import java.lang.reflect.*;
import java.util.jar.*;
public class Util {
/**
! * Invoke the loader.defineClass() class method to define the class stored in clsFile,
* with the following modification:
* <ul>
* <li> All ASCII strings in the class file bytes that matches fromString will be replaced with toString.
* NOTE: the two strings must be the exact same length.
* </ul>
*/
! public static Class defineModifiedClass(ClassLoader loader, File clsFile, String fromString, String toString)
throws FileNotFoundException, IOException, NoSuchMethodException, IllegalAccessException,
! InvocationTargetException
{
try (DataInputStream dis = new DataInputStream(new FileInputStream(clsFile))) {
byte[] buff = new byte[(int)clsFile.length()];
dis.readFully(buff);
replace(buff, fromString, toString);
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,
// 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));
System.out.println("Loaded : " + cls);
return cls;
}
}
--- 21,63 ----
* questions.
*
*/
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 lookup.defineClass() class method to define the class stored in clsFile,
* with the following modification:
* <ul>
* <li> All ASCII strings in the class file bytes that matches fromString will be replaced with toString.
* NOTE: the two strings must be the exact same length.
* </ul>
*/
! public static Class<?> defineModifiedClass(ClassLoader loader, File clsFile, String fromString, String toString)
throws FileNotFoundException, IOException, NoSuchMethodException, IllegalAccessException,
! InvocationTargetException, ClassNotFoundException
{
try (DataInputStream dis = new DataInputStream(new FileInputStream(clsFile))) {
byte[] buff = new byte[(int)clsFile.length()];
dis.readFully(buff);
replace(buff, fromString, toString);
System.out.println("Loading from: " + clsFile + " (" + buff.length + " bytes)");
! // 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<?> target = Class.forName("Hello", false, loader);
! Lookup lookup = privateLookupIn(target, lookup());
! Class<?> cls = lookup.defineClass(buff);
System.out.println("Loaded : " + cls);
return cls;
}
}
*** 105,145 ****
return b;
}
public static Class defineClassFromJAR(ClassLoader loader, File jarFile, String className)
throws FileNotFoundException, IOException, NoSuchMethodException, IllegalAccessException,
! InvocationTargetException {
return defineClassFromJAR(loader, jarFile, className, null, null);
}
/**
! * Invoke the loader.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
* app loader. This method is an easy way to force the class to be defined by the URLClassLoader.
*
* Optionally, you can modify the contents of the classfile buffer. See comments in
* defineModifiedClass.
*/
! public static Class defineClassFromJAR(ClassLoader loader, File jarFile, String className,
String fromString, String toString)
throws FileNotFoundException, IOException, NoSuchMethodException, IllegalAccessException,
! InvocationTargetException
{
byte[] buff = getClassFileFromJar(jarFile, className);
if (fromString != null) {
replace(buff, fromString, toString);
}
//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));
//System.out.println("Loaded : " + cls);
return cls;
}
--- 107,146 ----
return b;
}
public static Class defineClassFromJAR(ClassLoader loader, File jarFile, String className)
throws FileNotFoundException, IOException, NoSuchMethodException, IllegalAccessException,
! InvocationTargetException, ClassNotFoundException {
return defineClassFromJAR(loader, jarFile, className, null, null);
}
/**
! * 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
* app loader. This method is an easy way to force the class to be defined by the URLClassLoader.
*
* Optionally, you can modify the contents of the classfile buffer. See comments in
* defineModifiedClass.
*/
! public static Class<?> defineClassFromJAR(ClassLoader loader, File jarFile, String className,
String fromString, String toString)
throws FileNotFoundException, IOException, NoSuchMethodException, IllegalAccessException,
! InvocationTargetException, ClassNotFoundException
{
byte[] buff = getClassFileFromJar(jarFile, className);
if (fromString != null) {
replace(buff, fromString, toString);
}
//System.out.println("Loading from: " + ent + " (" + buff.length + " bytes)");
! Class<?> target = Class.forName("Hello", false, loader);
! Lookup lookup = privateLookupIn(target, lookup());
! Class<?> cls = lookup.defineClass(buff);
//System.out.println("Loaded : " + cls);
return cls;
}
*** 151,156 ****
--- 152,158 ----
byte[] buff = new byte[(int)ent.getSize()];
dis.readFully(buff);
return buff;
}
}
+
}
< prev index next >