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!