Этот ClassVisitor никогда не показывает сгенерированные частные методы, которые содержат содержимое лямбда-выражений.
ClassVisitor используется следующим образом (я обрезал функцию, я просто хочу знать, почему ClassVisitor не посещает private void lambda
, он работает с другими методами, такими как charm).
ClassReader classReader = new ClassReader(className);
ClassWriter classWriter = new ClassWriter(4);
CustomClassVisitor customClassVisitor = new CustomClassVisitor(classWriter);
classReader.accept(customClassVisitor,0);
modifiedClass = classWriter.toByteArray();
ClassVisitor:
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import static org.objectweb.asm.Opcodes.ASM7;
public class CustomClassVisitor extends ClassVisitor {
public CustomClassVisitor(ClassWriter classWriter) {
super(ASM7, classWriter);
}
public MethodVisitor visitMethod(
int access,
String name,
String desc,
String signature,
String[] exceptions) {
final MethodVisitor methodVisitor = cv.visitMethod(access, name, desc, signature, exceptions);
return methodVisitor;
}
}
Они в байт-коде:
private void lambda$main$0(java.lang.Integer)
descriptor: (Ljava/lang/Integer;)V
flags: (0x1002) ACC_PRIVATE, ACC_SYNTHETIC
Code:
stack=3, locals=2, args_size=2
0: aload_0
1: bipush 100
3: aload_1
4: invokevirtual #11 // Method java/lang/Integer.intValue:()I
7: invokevirtual #4 // Method wait:(II)V
10: return
LineNumberTable:
line 45: 0
line 46: 10
LocalVariableTable:
Start Length Slot Name Signature
0 11 0 this Lorg/Lambda;
0 11 1 elem Ljava/lang/Integer;
Как я могу увидеть этот метод в ASM ClassVisitor? Есть ли дополнительный параметр? ClassWriter находится в режиме 4.