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 实现自定义注解相关内容.
网友评论