文档章节

asm 笔记

52iSilence7
 52iSilence7
发布于 2016/06/10 10:11
字数 758
阅读 59
收藏 0

asm 读书笔记

标签(空格分隔): asm 类


#####类 编译过后的class结构:

  • 一部分描述修饰符,名称,超类,接口以及其上的annotation
  • 每个field为一部分,每部分里面包含属性的修饰符,名称,类型,annotation
  • 每个方法为一部分,包含构造函数,每部分包含了修饰符,名称,返回值,参数类型以及annotation,也包含方法的实现代码

#####源文件与类文件的不同#####

  • 一个类文件只描述一个class,源文件可以包含多个,当然,源文件中的主类内部类在编译后的类文件中都会有链接指向对方
  • 类文件中不包含注释
  • 类文件中没有package和import,所有的类型名称都是全路径
  • 类文件中包含了一个常量池,是一个包含所有的数字,字符串和类型常量的数组,并且只被定义一次

#####overall structure of a compiled class

Modifier,name,super class,interfaces
Constant pool:numeric,string,type constant
source file name
Enclosing class reference
Annotation*
Attribute*
Inner Class
Field*
Method*

#####内部名称

  • 类型描述

|java tyle | Type descriptor| | ----- | |boolean | Z| |char | C| |byte|B| |short|S| |int|I| |float|F| |long|J| |double|D| |Object|Ljava/lang/Object;| |int[]|[I|

在类中类型的表示更加简洁,而且源文件中的点转换为了斜杠 引用类型的L代表哪个单词?

  • 方法描述符 方法描述符其实就是参数类型和返回类型的类型描述符的集合在一个字符串中,其中并没有方法名称

    V for void void m(int i,float f) (IF)V int sss(Object o) (Ljava/lang/Object;)I void dd() ()V

#####解析类

解析类使用到唯一类就是 ClassReader

#####Execution Model

java代码在thread中执行,每一个线程都有自己都执行栈,由frame(帧)组成,每一帧都代表一个方法调用,每次方法调用时,新的帧就被压入当前线程的栈中,方法返回时,无论说正常返回还是由于异常抛出,这一帧都会被弹出执行栈

底下的关于method的涉及到指令,没有很看明白,各种指令交织,需要对汇编了解一点,不过对方法的底层实现倒是有了一点了解

ClassReader=>start: ClassReader
ClassVisitor=>operation: ClassVisitor
ClassVisitor2=>operation: ClassVisitor
ClassWriter=>end: ClassWriter

ClassReader->ClassVisitor->ClassVisitor2->ClassWriter
ClassReader->ClassVisitor: visit[Source,Method...]
ClassVisitor->ClassWriter: visit[Source,Method...]
ClassWriter->ClassVisitor: return value(void,MethodVisitor..);
ClassVisitor->ClassReader: return value(void,MethodVisitor..);

Asm的通过拦截链解析Class实现的很优雅,自己想要干预其中的某项生成,都可以很简单的实现相应的Visitor,把Visitor放入解析链中即可。理解ClassVisitor中的方法是什么难度,毕竟平时使用的就是注解,属性,方法等,但是MethodVisitor涉及到底层class的汇编代码,理解起来比较困难,可以选择先去学习下汇编相关知识以及jvm规范

© 著作权归作者所有

52iSilence7

52iSilence7

粉丝 7
博文 109
码字总数 92129
作品 0
海淀
高级程序员
私信 提问
上学期国嵌 gboot 学习笔记

.text.global _start_start:b resetldr pc, undifinedinstructionldr pc, softwareinterruptldr pc, prefetchabortldr pc, dataabortldr pc, notusedldr pc, _irqldr pc, _fiq undifinedinst......

weixin_38663832
2018/03/25
0
0
Oracle 常用命令笔记(1)

命令 说明 crsctl start has 启动数据库HAS服务。 crsctl stat res -t 检查ASM中的各服务(DG、监听、ASM实例等)状态。 srvctl status asm 查看ASM实例状态,正常情况下主备机的ASM实例都应...

abcwayne
2017/12/22
0
0
一个操作系统的实现-笔记

开发环境 操作系统:32位ubuntu汇编编译器:nasm虚拟机: bochs 版本0.1 代码如下 通过readelf -a kernel.bin命令,可以得到代码在文件kernel.bin中的偏移量。本例编译后为0x1000, 将它除以扇...

Pagination
2015/12/20
153
0
Spring3.0.5与Quartz的整合实现定时任务调度

最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现。对于一个新手来说,花了我不少时间,这里我写个笔记,给大家参考。 我使用的是Maven来管理项目,需要的Jar包我给大家...

星痕2018
2013/03/09
1K
0
动态生成字节码--Javassist

前言 Javaassist是一个高层的Java字节码处理类库,能运行时动态生成类,修改类。Javaassit能动态生成类的基础源于JavaClass的字节码技术:只要遵从规范,JavaClass可以来自任何地方。类似的技术还...

淡淡的倔强
2018/08/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Android面试常客之Handler全解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/fnhfire_7030/article/details/79518819 前言:又到了一年...

shzwork
3分钟前
0
0
position sticky 定位

本文转载于:专业的前端网站➫position sticky 定位 1、兼容性 https://caniuse.com/#search=sticky chrome、ios和firefox兼容性良好。 2、使用场景 sticky:粘性。粘性布局。 在屏幕范围内时...

前端老手
10分钟前
1
0
CentOS 7 yum 安装 PHP7.3 教程

参考:https://www.mf8.biz/centos-rhel-install-php7-3/ 1、首先安装 EPEL 源: yum install epel-release 安装 REMI 源: yum install http://rpms.remirepo.net/enterprise/remi-release......

dragon_tech
25分钟前
1
0
Linux物理网卡聚合及桥接

Linux内部实现的bridge可以把一台机器上的多张网卡桥接起来,从而把自己作为一台交换机。同时,LInux bridge还支持虚拟端口,即桥接的不一定都是物理网卡接口,还可以是虚拟接口。目前主要表...

xiangyunyan
25分钟前
1
0
一起来学Java8(一)——函数式编程

在这篇文章中,我们将了解到在Java8下如何进行函数式编程。 函数式编程 所谓的函数式编程就是把函数名字当做值进行传递,然后接收方拿到这个函数名进行调用。 首先来看下JavaScript如何进行函...

猿敲月下码
57分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部