程序员

Android 进阶笔记 -- ASM 运用

2020-05-15  本文已影响0人  jimdear

1.what is ASM?
对于了解了JVM之后, 对java代码的操作比较常见的就是字节码插庄了.而java 文件被编译成class 文件之后,其实class文件也是可以被修改的.如下,源文件是:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import com.xk.annotation_lib.BindView;
public class MainActivity1 extends AppCompatActivity {
    @BindView(R.id.withText)
    TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

那么对应的字节码是啥呢,其实是有一一对应关系的, 如下贴图:

public class com/xk/annotation_compile/AnnotationHandlerUtils {

  // compiled from: AnnotationHandlerUtils.java

  // access flags 0x1
  public <init>()V
   L0
    LINENUMBER 7 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this Lcom/xk/annotation_compile/AnnotationHandlerUtils; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x9
  public static handlerBindView()V
   L0
    LINENUMBER 10 L0
    RETURN
    MAXSTACK = 0
    MAXLOCALS = 0
}

其中相应的代码一一对应的关系,参考asm的api ,意思就是把java代码转换成字节码,这里推荐装一个Android Studio 的插件 ,名字叫ASM Byte Viewer.通过插件商店就可以下载到了啦.
直接上图:


ASM插件名图.png

2.what‘s usage for ASM in Android ?
那么到底用啥用呢, 如果项目中有集成一些第三方的埋点插件,或者是ButterKnife 你就会发现,他的运用的广泛了.

这一章就先记录这么多,下一章, 讨论下Javapoet +ASM 实现自定义注解相关内容.

上一篇下一篇

猜你喜欢

热点阅读