public static <T> Class<? extends T> defineClass(ClassDefinition classDefinition, Class<T> superType, DynamicClassLoader classLoader) { log.debug("Defining class: %s", classDefinition.getName()); return classGenerator(classLoader).defineClass(classDefinition, superType); } }
public static ClassGenerator classGenerator(ClassLoader parentClassLoader) { return classGenerator(parentClassLoader, ImmutableMap.of()); }
public static ClassGenerator classGenerator(ClassLoader parentClassLoader, Map<Long, MethodHandle> callSiteBindings) { return classGenerator(new DynamicClassLoader(parentClassLoader, callSiteBindings)); }
public static <T> Class<? extends T> defineClass(ClassDefinition classDefinition, Class<T> superType, DynamicClassLoader classLoader) { log.debug("Defining class: %s", classDefinition.getName()); return classGenerator(classLoader).defineClass(classDefinition, superType); } }
public static <T> Class<? extends T> defineClass(ClassDefinition classDefinition, Class<T> superType, DynamicClassLoader classLoader) { log.debug("Defining class: %s", classDefinition.getName()); return classGenerator(classLoader).defineClass(classDefinition, superType); } }
@BeforeClass public void setUp() throws Exception { for (Class<?> aClass : ImmutableList.of(boolean[].class, char[].class, float[].class, double[].class, byte[].class, short[].class, int[].class, long[].class, String[].class)) { MethodDefinition methodDefinition = defineSetAndGetMethod(aClass); typeMethodMap.put(aClass, methodDefinition); } classGenerator(classLoader).defineClass(classDefinition, Object.class); }
public static Object execute(Function<Scope, BytecodeNode> nodeGenerator, ParameterizedType returnType, Optional<ClassLoader> parentClassLoader) throws Exception { ClassDefinition classDefinition = new ClassDefinition( a(PUBLIC, FINAL), uniqueClassName("test", "Test"), type(Object.class)); MethodDefinition method = classDefinition.declareMethod(a(PUBLIC, STATIC), "test", returnType); BytecodeNode node = nodeGenerator.apply(method.getScope()); method.getBody().append(node); String tree = dumpBytecodeTree(classDefinition); if (DUMP_BYTECODE_TREE.get()) { System.out.println(tree); } ClassLoader classLoader = parentClassLoader.orElse(BytecodeExpressionAssertions.class.getClassLoader()); return classGenerator(classLoader) .defineClass(classDefinition, Object.class) .getMethod("test") .invoke(null); } }
Class<?> codecClass = classGenerator(classLoader) .runAsmVerifier(debug) .dumpRawBytecode(debug)
StringWriter writer = new StringWriter(); Class<?> clazz = classGenerator(getClass().getClassLoader()) .fakeLineNumbers(true) .runAsmVerifier(true)