我们都知道JAVA是一种解析型说话,这就抉择JAVA文件编译后不是机械码,而是一个字节码文件,也就是CLASS文件。而这样的文件是存在纪律的,经由反编译工具是可以还原回来的。例如Decafe、FrontEnd,YingJAD和Jode等等软件。下面是《Nokia中Short数组转换算法》 类中Main函数的ByteCode:) r1 |. N7 \7 S& Z
0 ldc #16! Z$ U& E! K, u( p2 c& S
2 invokestatic #18
$ ~; y ?* F$ J* z3 a: \ 5 astore_1
! I/ b& Z2 {) d; ]" K/ A) z% a 6 return! x M) R( g5 }! v" l' v% _
其源代码是:short [] pixels = parseImage("/ef1s.png");/ g/ Q. G( z% `9 w% j
我们经由过程反编译工具是可以还原出以上源代码的。而经由过程简单的剖析,我们也能自己写出源代码的。
! Y% I H9 J( ~ 第一行:ldc #16: s, f* u5 V& c1 Z( e9 o" W6 d5 N% r
ldc为虚拟机的指令,浸染是:压入常量池的项,形式如下( d( R3 t y- Y+ D5 L z" L
ldc index% Y3 z8 l2 ]" Q
这个index就是膳缦沔的16,也就是在常量池中的有用索引,当我们去看常量池的时辰,我们就会找到index为16的值为String_info,琅缦沔存了/ef1s.png.2 [) u4 }; N ~, X" S- `5 I
所以这行的意思就是把/ef1s.pn作为一个String存在常量池中,其有用索引为16。& Q1 x6 t1 |+ z7 ?
第二行:2 invokestatic #18: u9 J/ J4 L# }+ x" L; A: F
invokestatic为虚拟机指令,浸染是:挪用类(static)体例,形式如下
* r( i9 W# U2 a% c& H$ o" c invokestatic indexbyte1 indexbyte2: J* g2 {: ^, q0 U4 J
其中indexbyte1和indexbyte2必需是在常量池中的有用索引,而是指向的类型必需有Methodref标识表记标帜,对类名,体例名和体例的描述符的引用。2 Y2 s4 j# X& y! T
所以当我们看常量池中索引为18的处所,我们就会获得以下信息:
7 p6 g$ _6 |5 U8 l' K Class Name : cp_info#1
$ s ?0 X& ^$ n7 b Name Type : cp_info#19
0 B7 D5 d& X* p 1 和19都是常量池中的有用索引,值就是右边中的值,再往下跟踪我就不多说了,有乐趣的伴侣可以去JAVA虚拟机规范。
4 w( S5 A9 R; H4 s# g4 T 这里我简单介绍一下parseImage(Ljava/lang/String;)[S 的意思。
- {( h4 M2 a, }8 Z+ a4 {7 Q 这就是parseImage这个函数的运行,我们反过来看看parseImage的原型就年夜白了5 V+ z& y# [0 } E' q
short [] parseImage(String)
! X3 I& X2 P; m2 z9 H8 g1 w3 r; g4 U9 A5 N 那么Ljava/lang/String;就是说需要传入一个String对象,而为什么前面要有一个L呢,这是JAVA虚拟机用来暗示这是一个Object。如不美观是根基类型,这里就不需要有L了。然后返回为short的一维数组,也就是对应的[S。是不是很有意思,S对应着Short类型,而 “[”对应一维数组,那有些伴侣要问了,两维呢,那就“[[”,呵呵,是不是很有意思。; X3 c: q5 G* `) A$ c
好了,挪用了函数,返回的值要保留下来吧。那么就是第三行要做的工作了。
; H5 r- }% A. G. G4 C4 F 第三行:5 astore_1
+ L% y8 K- [, T5 U 呵呵,很简单的。可是饶暌剐文章,也是斗劲轻易杂乱的处所。
+ X, e2 \) r4 f$ D, W/ r astore_为虚拟机指令,浸染为:将当前reference存储到局部变量中去。而必需是对当前框架的局部变量的有用索引。打个例如,可能我们这个函数中可能还要用到这个局部变量,我们可以经由过程来找到它。例如挪用虚拟机指令:8 I" m: }) _* N# o- e' `
aload_1,就能获得该值。& k {- T* h/ x' g t$ b' F
第四行:6 return0 q/ ^8 ?) h% ~# p, x8 B- [3 w
同样的,return也是虚拟机指令了,它的浸染为:细腻式返回void。" d+ p0 F9 M+ b2 i
这里也就是退出main函数。
4 ]$ K' T( O1 o! {: g8 T3 [. M( z3 t! B0 I) O( w6 J9 }) j
---------------------------------------------------------------------------- |