专栏名称: 蚂蚁金服ProtoTeam
数据前端团队
目录
相关文章推荐
51好读  ›  专栏  ›  蚂蚁金服ProtoTeam

通过Gradle的Transform配合ASM实战路由框架和统计方法耗时

蚂蚁金服ProtoTeam  · 掘金  · 前端  · 2017-12-08 02:14

正文

请到「今天看啥」查看全文


然后,最麻烦的就是字节码注入的部分功能了,先看一下主要的调用代码:

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中的代码是什么模样: 生成好的路由表:

这里写图片描述







请到「今天看啥」查看全文