public static ParameterizedType makeClassName(String baseName, Optional<String> suffix) { String className = baseName + "_" + suffix.orElseGet(() -> Instant.now().atZone(UTC).format(TIMESTAMP_FORMAT)) + "_" + CLASS_ID.incrementAndGet(); return typeFromJavaClassName("com.facebook.presto.$gen." + toJavaIdentifierString(className)); }
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); } }
System.out.println(dumpBytecodeTree(classDefinition));
public static ParameterizedType uniqueClassName(String basePackage, String baseName) { String className = toJavaIdentifierString(baseName) + "_" + CLASS_ID.incrementAndGet(); return typeFromJavaClassName(basePackage + ".$gen." + className); }
public static ParameterizedType makeClassName(String baseName, Optional<String> suffix) { String className = baseName + "_" + suffix.orElseGet(() -> Instant.now().atZone(UTC).format(TIMESTAMP_FORMAT)) + "_" + CLASS_ID.incrementAndGet(); return typeFromJavaClassName("io.prestosql.$gen." + toJavaIdentifierString(className)); }
public static ParameterizedType makeClassName(String baseName, Optional<String> suffix) { String className = baseName + "_" + suffix.orElseGet(() -> Instant.now().atZone(UTC).format(TIMESTAMP_FORMAT)) + "_" + CLASS_ID.incrementAndGet(); return typeFromJavaClassName("io.prestosql.$gen." + toJavaIdentifierString(className)); }
@Test public void testToJavaIdentifierString() { assertEquals(toJavaIdentifierString("HelloWorld"), "HelloWorld"); assertEquals(toJavaIdentifierString("Hello$World"), "Hello$World"); assertEquals(toJavaIdentifierString("Hello#World"), "Hello_World"); assertEquals(toJavaIdentifierString("A^B^C"), "A_B_C"); } }