正文
然后,最麻烦的就是字节码注入的部分功能了,先看一下主要的调用代码:
ClassReader classReader = new ClassReader(file.bytes)
ClassWriter classWriter = new ClassWriter(classReader, ClassWriter.COMPUTE_MAXS)
NeacyAsmVisitor classVisitor = new NeacyAsmVisitor(Opcodes.ASM5, classWriter)
classReader.accept(classVisitor, ClassReader.EXPAND_FRAMES)
调用的主要代码量还是比较少的,主要是自定义一个ClassVisitor。在每一个ClassVisitor中它会分别
visitAnnotation
和
visitMethod
@Override
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
NeacyLog.log("=====---------- NeacyAsmVisitor visitAnnotation ----------=====");
NeacyLog.log("=== visitAnnotation.desc === " + desc);
AnnotationVisitor annotationVisitor = super.visitAnnotation(desc, visible);
if (Type.getDescriptor(NeacyProtocol.class).equals(desc)) {// 如果注解不为空的话
mProtocolAnnotation = new NeacyAnnotationVisitor(Opcodes.ASM5, annotationVisitor, desc);
return mProtocolAnnotation;
}
return annotationVisitor;
}
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
NeacyLog.log("=====---------- visitMethod ----------=====");
MethodVisitor mv = cv.visitMethod(access, name, desc, signature, exceptions);
mMethodVisitor = new NeacyMethodVisitor(Opcodes.ASM5, mv, access, name, desc);
return mMethodVisitor;
}
在
visitAnnotation
中就是我们扫描相对应的注解的地方类似
Type.getDescriptor(NeacyProtocol.class).equals(desc)
判断是否是我们需要的处理的注解,像这里我们主要处理前面定义好的注解
NeacyProtocol
和
NeacyCost
两个注解就好。
这里我要展示一下注入成功之后的class中的代码是什么模样: 生成好的路由表: