现在JAVA说话在全世界规模正如火如荼般的风行,它广范地应用在INTERNET的数据库、多媒体、CGI、及动态网页的建造方面。1999年在美国对JAVA轨范员的需求量初度跨越C++! 作者因比来剖析一些JAVA轨范,对JAVA的反编译进行了一番体味,下面将我所体味的情形作以下介绍,但愿对JAVA快乐喜爱者有所辅佐。
7 @3 O& q, ? T! b! E9 u9 H# x) p JAVA是采用一种称做“字节编码”的轨范结构,分为小轨范(嵌入到HTML文件中)和应用轨范(直接在呼吁状况下执行)两种类型。无论哪种结构,一旦用JAVAC 呼吁编译后,均酿成后缀为CLASS的同名可执行文件。这种文件是不成阅读的代码。
9 x0 g2 l1 J7 j 经查阅了SUN公司的JDK(JDK1.1.3)文档资料后,我找到了一个据称是可反编译JAVA的JAVAP文件(EXE),这个文件位于JDKBIN 下面,经按声名使用后,感应失踪望,原本这个“反编译”仅可反编译出JAVA轨范的数据区(界说)、若干体例和类的引用等。
! \" y# D6 ]# r2 [5 ?8 v 这里我用了一个简单例子来声名问题。
& H* r/ I* D: p( |' f7 a1 x9 {( H JAVA的源轨范hello_java.java如下:
- D6 k6 J1 C7 [6 D- P) X import java.applet.*;, [ S8 G6 N d: B, p% t: S9 ]" H
import java.awt.*;
4 U* x& R# G/ n, k" g) r public class hello_java extends Applet
" h: {: x, c- a1 r! Z {
, m# a4 _; W$ T5 L1 T3 B public void paint(Graphics g)* H% T; Q0 \! j) m3 h0 j
{
/ X2 E2 o H: d0 C g.drawString("Hello Java!n",20,20);% s3 t7 G% d9 D1 B
}
# O6 c! Q, z: W: R0 \: i3 e- | }+ B8 z8 i, n7 z& _
经用反编译呼吁:javap -c -package -public -private hello_java hello.java" V+ m' ]8 a: k2 G- v$ k* `
获得的反编译结不美观(hello.java)如下:(有关javap呼吁的选择参数请见其使用声名,这里-c暗示选择了反编译)9 u1 C( e j, Z$ a* y
Compiled from hello_java.java Y* z$ _9 R- |
public synchronized class hello_java extends java.applet.Applet: X/ Y! a1 ?( T
/* ACC_SUPER bit set */
$ S( J `( Q$ d- G. x {" S% a p# h+ C7 Y3 Z/ D
public void paint(java.awt.Graphics);
( d3 {! O' M: L1 n$ K public hello_java();; z* e: c1 ]9 {, s2 U
Method void paint(java.awt.Graphics)# ?) k' y4 e5 ~" d h3 D
0 aload_1
* e) C- V. V/ s. i. q7 U4 _/ j 1 ldc #1
- D6 ^& s! S7 Y 3 bipush 20+ z- r: F1 I* b
5 bipush 20
+ [& J/ ?6 C' J4 I$ [/ K' E 7 invokevirtual #6+ y4 p1 B6 z& a( [$ m6 q( T
10 return
# H2 X3 m6 Q0 s4 `1 [( A8 [ Method hello_java()
h& ?/ ]; R7 i" s! ~ 0 aload_0
5 O( Y' ~5 ^, u0 {; X 1 invokespecial #5 ()V>
# p* x2 y4 m$ H3 \& t( s 4 return
! y9 F" v" F; S. S8 u# G7 v
% Z6 i/ \8 U7 t6 G4 \2 z } |