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.通过插件商店即可以下载到了啦.
直接上图:
2.what‘s usage for ASM in Android ?
那么究竟用啥用呢, 假如项目中有集成少量第三方的埋点插件,或者者是ButterKnife 你就会发现,他的运用的广泛了.
这一章就先记录这么多,下一章, 探讨下Javapoet +ASM 实现自己设置注解相关内容.