You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@river.apache.org by Peter Firmstone <ji...@zeus.net.au> on 2014/05/28 11:06:14 UTC

Playing around with ASMifier

Take one very simple class, compile it and process it with ASMifier and 
guess what?

Classes that implement functional interfaces are compiled to contain 
synthetic bridge methods that check Generic type casts!

In other news I'm still waiting for a Jenkins run to complete without 
someone aborting it early, I've asked on infrastructure if they can 
limit who can abort running tests to those who created them or Jenkins 
administrators.

public class ConsumerTest1 implements Consumer<String> {

     @Override
     public void accept(String t) {
         System.out.println(t);
     }

}

package asm.testing;
import java.util.*;
import org.objectweb.asm.*;
import org.objectweb.asm.attrs.*;
public class ConsumerTest1Dump implements Opcodes {

public static byte[] dump () throws Exception {

ClassWriter cw = new ClassWriter(0);
FieldVisitor fv;
MethodVisitor mv;
AnnotationVisitor av0;

cw.visit(52, ACC_PUBLIC + ACC_SUPER, "testing/ConsumerTest1", 
"Ljava/lang/Object;Ljava/util/function/Consumer<Ljava/lang
/String;>;", "java/lang/Object", new String[] { 
"java/util/function/Consumer" });

{
mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", 
false);
mv.visitInsn(RETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();
}
{
mv = cw.visitMethod(ACC_PUBLIC, "accept", "(Ljava/lang/String;)V", null, 
null);
mv.visitCode();
mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", 
"Ljava/io/PrintStream;");
mv.visitVarInsn(ALOAD, 1);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", 
"(Ljava/lang/String;)V", false);
mv.visitInsn(RETURN);
mv.visitMaxs(2, 2);
mv.visitEnd();
}
{
mv = cw.visitMethod(ACC_PUBLIC + ACC_BRIDGE + ACC_SYNTHETIC, "accept", 
"(Ljava/lang/Object;)V", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 1);
mv.visitTypeInsn(CHECKCAST, "java/lang/String");
mv.visitMethodInsn(INVOKEVIRTUAL, "testing/ConsumerTest1", "accept", 
"(Ljava/lang/String;)V", false);
mv.visitInsn(RETURN);
mv.visitMaxs(2, 2);
mv.visitEnd();
}
cw.visitEnd();

return cw.toByteArray();
}
}

Re: Playing around with ASMifier

Posted by Dawid Loubser <da...@travellinck.com>.
Interesting! Thanks for sharing this, Peter.

Dawid


On 28/05/2014 11:06, Peter Firmstone wrote:
> Take one very simple class, compile it and process it with ASMifier
> and guess what?
>
> Classes that implement functional interfaces are compiled to contain
> synthetic bridge methods that check Generic type casts!