package de.dhbwstuttgart.bytecode; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.lang.invoke.CallSite; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Handle; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; import javassist.runtime.Desc; public class Test { private static final String rootDirectory = System.getProperty("user.dir") + "/bin/de/dhbwstuttgart/bytecode/"; protected static ClassLoader getClassLoader() throws Exception { File file = new File(rootDirectory); URL url = file.toURI().toURL(); URL[] urls = new URL[] { url }; System.out.println(urls[0]); return new URLClassLoader(urls); } public static void main(String[] args) { // Test Lambda ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, "TestClass", null, "java/lang/Object", null); cw.visitSource("TestClass.java", null); // Create Constructor MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "", "()V", null, null); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "", "()V"); // mv.visitMethodInsn(INVOKEDYNAMIC, "#0", "run", "()Ljava/lang/Runnable"); //Call site, which, when invoked, returns an instance of the functional interface to which //the lambda is being converted MethodType mt = MethodType.methodType(CallSite.class, MethodHandles.Lookup.class, String.class, MethodType.class, MethodType.class, MethodHandle.class, MethodType.class); Handle bootstrap = new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory", mt.toMethodDescriptorString()); Handle arg2 = new Handle(Opcodes.H_INVOKESTATIC, "TestClass", "lambda$0", "()V"); mv.visitInvokeDynamicInsn("run", "()Ljava/lang/Runnable;", bootstrap, Type.getMethodType("()V"), arg2, Type.getMethodType("()V")); mv.visitVarInsn(Opcodes.ASTORE, 1); mv.visitVarInsn(Opcodes.ALOAD, 1); mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/lang/Runnable", "run", "()V"); mv.visitInsn(Opcodes.RETURN); // creates bridge method, contains lambdas body MethodVisitor mvl = cw.visitMethod(Opcodes.ACC_PRIVATE + Opcodes.ACC_STATIC + Opcodes.ACC_SYNTHETIC, "lambda$0", "()V", null, null); mvl.visitCode(); mvl.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mvl.visitLdcInsn("lambda"); mvl.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V"); mvl.visitInsn(Opcodes.RETURN); mvl.visitMaxs(2, 0); mvl.visitEnd(); mv.visitMaxs(1, 2); mv.visitEnd(); cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup", Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC + Opcodes.ACC_FINAL); cw.visitEnd(); byte[] b = cw.toByteArray(); // Test if statement /* * ClassWriter cw = new * ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS); * * cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC+Opcodes.ACC_SUPER, "TestIf", null, * "java/lang/Object", null); MethodVisitor mv = * cw.visitMethod(Opcodes.ACC_PUBLIC, "", "(Ljava/lang/Boolean;)V", null, * null); mv.visitCode(); * * // Label l0 = new Label(); // mv.visitLabel(l0); * * mv.visitVarInsn(Opcodes.ALOAD, 0); * * mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "", * "()V"); * * // Label l1 = new Label(); // mv.visitLabel(l1); * mv.visitVarInsn(Opcodes.ALOAD, 1); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, * "java/lang/Boolean", "booleanValue", "()Z"); * * Label label = new Label(); mv.visitJumpInsn(Opcodes.IFEQ, label); * * mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", * "Ljava/io/PrintStream;"); mv.visitLdcInsn("1"); * mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", * "(Ljava/lang/String;)V"); * * Label endLabel = new Label(); mv.visitJumpInsn(Opcodes.GOTO, endLabel); * * mv.visitLabel(label); mv.visitFieldInsn(Opcodes.GETSTATIC, * "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitLdcInsn("0"); * mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", * "(Ljava/lang/String;)V"); * * * * mv.visitLabel(endLabel); mv.visitInsn(Opcodes.RETURN); * * // Label l2 = new Label(); // mv.visitLabel(l2); * * // mv.visitLocalVariable("this", "LTestIf;", null, l0, l2, 0); // * mv.visitLocalVariable("b", "Ljava/lang/Boolean;", null, l0, l2, 1); * mv.visitMaxs(2, 2); mv.visitEnd(); * * cw.visitEnd(); byte[] b = cw.toByteArray(); */ FileOutputStream output; try { output = new FileOutputStream(new File(System.getProperty("user.dir") + "/testBytecode/TestClass.class")); output.write(b); output.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }