zoukankan      html  css  js  c++  java
  • DJ_Java_Decompiler新手入门教程

     首先声明:这篇文章并不是我原创,只是感觉挺有用处,想跟大家分享一下,所以标注为原创,希望能有更多的朋友可以看到,还请原作者谅解。微笑


     昨天大D说让我写下DJ入门的基础,今天写了一大半了,结果不小心把浏览器给关掉了,伤心死了,本来里面请了点JAVA知道的,但是现在就不讲了,下次有时间再讲吧,在公司不好弄,今天就只请DJ

    话说回来,先看图


    其中代码区是DJ反编译出来的源码
    方法列表区是在这个类里所有的方法的列表,双击后会在代码区进入该方法的区域,快捷键区我们用不着,因为那些是把这个当作IDE才用的着的,比如写JAVA程序啦

    下面我们请下这个怎么用,首先我们用DJ写段小程序看看
    打开记事本,加入以下代码 
    public class b { 
    public static void main(String args[]){     
      int i=5,n= Integer.parseInt(args[0]);         //定义整形变量i=5,n=从命令行输入的参数  
       boolean flag=i>n ? true:false;                                  //定义boolean型变量flag.并用三目运算符计算flag的值,如果i大于n,flag值为true,如果i不大于n,flag值为false 

      System.out.println(flag);                            //输出flag的值 

    }  
    保存到D,存为b.java 
    打开命令提示符,输入d: 
    javac b.java 
    java b 8 
    java b 3 
    注意:每句都要回车  
    运算结果 


    b后面的数字是给程序传数进去,我们的n就是读的这个参数 
    下面我用用DJ反编译b.class,这个文件和b.java在一个目录里,当我们用javac b.java时就会生成这个文件,java b全写应该是java b.class,但是后面的后缀可以省略,前面的.java不能省

    UltraEdit-32打开

    尴尬不好意思,这个图片上传失败了



    看不懂吧,说实话,要是把这个看懂也不难,但如果里面有中文那就难懂了
    下面再用我们的DJ打开



    代码反编译出来后和我们原来的不一样吧,多了一个public b(),其实这个不是多的,每个类都要有一个和自己类名相同的构造方法,只是我们没写而已
    下面的main函数里也和我们原来写的不一样了
    我们原来的int i=5变成了byte byte0 = 5; //其实这个无所谓了,因为每个我们的i值为5,用不着int型的,byte就够了,这是JAVA给我们优化的
    下面n的值在这里变成了i的值,这个都无所谓的,因为JAVA编译成字节码后算的是顺序,名字无所谓
    后面的三目运算符也差不多的.输出函数都一样的了.那大家在想了,这样有什么用呢,我们把他反编译成了源码也用不着啊,HALO里根本看不到这样的东西,全是字节码

    下面说到正题了,DJ,settings-Decompiler settings,在弹出的窗口中选中Generate JVM instructions as comments(annotete),然后点OK,再按F5刷新 
    如图

    第句源码下面的//开头的都是上面的语句的字节码.比如 
            byte byte0 = 5; 
        //    0    0:iconst_5        
        //    1    1:istore_1      
    源码是byte byte0=5;       字节码是 
    //0 0:iconst_5; 
    //1 1:istore_1; 
    大家看到了,这里面都是以0开始计数,但是HALO里是以1开始计数的                           
    下图
                                      
    所以大家在删代码的时候,如果DJ里是5,那么大HALO里就要5+1=6.切记..... 
    大家又想问,iconst_5,istore_1是啥意思呢
    iconst_5   将int型5推送至栈顶 
    istore_1   将栈顶int型数值存入第二个本地变量(网上都说是第一个) 
    不知道为什么是第二个,而不是第一?难道也从0开始,在网上查了下都说是第一个,而我的那个JVM指令集说是第二个,不管这个了,这只是相变量索引值,看下面的代码还能看到istore_2,istore_3之类的,这些是索引,不是真正的值. 

            boolean flag = byte0 > i; 
        //    7    9:iload_1         
        //    8   10:iload_2         
        //    9   11:icmple          18 
        //   10   14:iconst_1        
        //   11   15:goto            19 
        //   12   18:iconst_0        
        //   13   19:istore_3        
    这段是三目运算符的代码,iload_1,iload_2;是取出istore_1和istore_2索引变量取出,就是上面的那个命令存进去的索引值. 
    然后icmple相当于if,他会拿栈顶的两个值进行比较,就是iload_1,iload_2中的两个值,如果小于等于0就跳转,就是goto下面的语句,goto相当于else,这句话的意思就是,拿两个值比较,如果iload_1中的值大于iload_2的值就往下执行icmple后的语句,然后跳过goto后面的语句,如果小于就跳过下语句,而执行goto下面的语句.大家看到icmple下面的iconst_1了吧,这句就是给int赋值为1,boolean是true,这下大家知道为什么那些XX教程里为什么留两中都有这句了吧,知道这句goto下面的iconst_0大家应该也猜到是false了吧, 
    istore_3是把变量存入第3个变量(icmple和goto各一句,这句不属于goto,不管icmple和goto执行了哪一个,都会执行这一句,这句是将判断的值存进栈的).然后下面的 
            System.out.println(flag); 
        //   14   20:getstatic       #3   <Field PrintStream System.out> 
        //   15   23:iload_3         
        //   16   24:invokevirtual   #4   <Method void PrintStream.println(boolean)> 
        //   17   27:return       
    是打印语句, 
    getstatic   获取指定类的静态域,并将其值压入栈顶 
    这句是装System.out这个静态方法取出, 
    iload_3将刚才存入的那个值取出来,下面的invokevirtual   #4   <Method void PrintStream.println(boolean)>开始输出指定数据类型的值,return跳出. 

    今天就讲这么多了,要正式上班了,看我在上班时候写的份上怎么也要顶下吧. 


    JVM字节码到这里下载,是中文的,方便XX. 
    http://bbs.cn456.com/read-htm-tid-52033.html

  • 相关阅读:
    What Apache ZooKeeper is and when should it be used?
    基于Apache Curator框架的ZooKeeper使用详解
    Curator典型应用场景之Master选举
    Curator典型应用场景之事件监听
    Curator典型应用场景之分布式锁
    Zookeeper原生Java API、ZKClient和Apache Curator 区别对比
    IntelliJ IDEA oneline function formatting
    Converting a List to String in Java
    UNIAPP 微信小程序做H5 PDF预览
    Git 常用命令,持续更新
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3151380.html
Copyright © 2011-2022 走看看