As reported on StackOverflow
(http://stackoverflow.com/questions/38809101/asm-cannot-pass-type-int-type-
as-constant-bootstrap-method-argument), if a Type representing a primitive
class (e.g., Type.INT_TYPE) is used as a bootstrap method argument, then
ClassReader reads it as an object type rather than a primitive type (e.g.,
type.getSort() == Type.OBJECT rather than type.getSort() == Type.INT).
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
cw.visit(Opcodes.V1_8, 0, "c", null, null, null);
MethodVisitor mv = cw.visitMethod(0, "m", "()V", null, null);
mv.visitInvokeDynamicInsn("foo", "(I)I",
new Handle(Opcodes.H_INVOKESTATIC, "o", "n", "()Ljava/lang/Object;"),
Type.INT_TYPE);
mv.visitEnd();
cw.visitEnd();
new ClassReader(cw.toByteArray()).accept(new ClassVisitor(Opcodes.ASM5) {
@Override
public MethodVisitor visitMethod(int access, String name, String desc,
String signature, String[] exceptions) {
return new MethodVisitor(Opcodes.ASM5) {
@Override
public void visitInvokeDynamicInsn(String name, String desc,
Handle bsm, Object... bsmArgs) {
System.err.println(Arrays.toString(bsmArgs));
}
};
}
}, 0);