一个Java代码,编译后会生成 A.class B.class C.class等文件(举例子)。但是使用jad命令进行反编译,还原到以前的那个Java代码。好像就有点乱了!只给你.class文件,你如何能完整的写出原代码?对反编译感兴趣的可以发表下看法。

解决方案 »

  1.   

    直接用反编译工具不就可以吗?下面是jad命令的解释JAD命令
    首先,看一下jad的帮助提示-a - 用JVM字节格式来注解输出 
    -af - 同 -a,但是注解的时候用全名称 
    -clear - 清除所有的前缀 
    -b - 输出多于的括号 (e.g., if(a) { b(); }, default: no) 
    -d <dir> - 指定输出文件的文件目录 
    -dead -试图反编译代码的dead 部分(default: no) 
    -disass - 不用用字节码的方式反编译 (no JAVA source generated) 
    -f - 输出整个的名字,无论是类还是方法 
    -ff -输出类的成员在方法之前 (default: after methods) 
    -i - 输出所有的变量的缺省的最初值 
    -l<num> - 将strings分割成指定数目的块的字符 (default: no) 
    -lnc - 将输出文件用行号来注解 (default: no) 
    -nl - 分割strings用新行字符 newline character (default: no) 
    -nodos -不要去检查class文件是否以dos方式写 (CR before NL, default: check) 
    -nocast - 不要生成辅助文件 
    -nocode -不要生成方法的源代码 
    -noconv - 不要转换java的定义符 (default: do) 
    -noctor - 不允许空的构造器存在 
    -noinner -关掉对内部类的支持 (default: turn on) 
    -nolvt - 忽略局部变量的表信息 
    -nonlb - 不要输出一个新行在打开一个括号之前 (default: do) 
    -o - 无需确认直接覆盖输出 (default: no) 
    -p - 发送反编译代码到标准输出 STDOUT (e.g., for piping) 其次.常用命令jad -o -r -sjava -dsrc test.classtree目录下的所有*.class文件
        jad -o -r -sjava -dsrc tree/**/*.class    unix可以表示为:jad -o -r -sjava -dsrc 'tree/**/*.class'指定输出文件的名字的话,用以下的转移命令jad -p example1.class > myexm1.java 
      

  2.   

    嗯 这个我知道的 如果只给你3个.class文件(这3个文件是一个applet程序编译的二进制文件),在没有原Java的代码的情况下,你采取方法将其运行出来就可以了……
      

  3.   

    那直接用java命令来运行你的.class文件就可以啊java a.class 
      

  4.   

    你用 HelloWorld.java 程序编译,HelloWorld.class 然后再用你的方法试下
      

  5.   

    我的意思是这样的 你先写一个稍微有点复杂的Java代码。里面包含有3个以上的方法,以及相关的子类。但只有一个main()方法。然后你将其编译,编译之后,删除原来的 a.java文件。接下来,你使用仅有的.class文件将程序的结果运行出来,就可以了(不管你使用什么方法)。动手操作下…… 谢了!
      

  6.   

    用jad这样做了,可以正常运行,和在编译器中运行结果一样,有什么问题想说?
      

  7.   

    jd-gui Java反编译器
     直接把class拖到界面上就行了
      

  8.   


    但jvm如果没有对文件进行优化处理呢?反编译处理的属性一般是在方法之前
      

  9.   

    JAVA反编译工具 如:XJad当然不可能和源代码一模一样,有点差异的