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 ()V

L0

LINENUMBER 7 L0

ALOAD 0

INVOKESPECIAL java/lang/Object. ()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.通过插件商店就可以下载到了啦.

直接上图:

a9c8df9e0a5e

ASM插件名图.png

2.what‘s usage for ASM in Android ?

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

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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐