精华内容
下载资源
问答
  • <Inside JVM>是市面上少数几本系统介绍JVM的书籍,(作者Bill Venners的网站artima也是...最新的是第二版,也有些年头了,尽管JVM规范本身的变化并不大,但是java编译器的有些细节处理还是跟书里面不...
    <Inside JVM>是市面上少数几本系统介绍JVM的书籍,(作者Bill Venners的网站artima也是非常有趣的Java技术社区),这本书最有意思的地方可能就是作者为了演示JVM内部工作原理编写的Applet, 非常值得向大家推荐。<Inside JVM>最新的是第二版,也有些年头了,尽管JVM规范本身的变化并不大,但是java编译器的有些细节处理还是跟书里面不一样了,比如说现在的java编译器一般都会对finally作inline处理。

    这个Applet演示的是下面这段程序的bytecode。
    代码1:
    /*
    *copiedfrom
    http://www.artima.com/insidejvm/applets/HopAround.html
    */

    classClown...{

    staticinthopAround()...{
    inti=0;
    while(true)...{
    try...{
    try...{
    i
    =1;
    }
    finally...{//Thefirstfinallyclause
    i=2;
    }
    i
    =3;
    //Thisreturnnevercompletes,becauseof
    //thecontinueinthesecondfinallyclause
    returni;
    }
    finally...{//Thesecondfinallyclause
    if(i==3)...{
    //Thiscontinueoverridesthereturnstatement
    continue;
    }
    }
    }
    }
    }


    其主要目的演示的是finally子句的处理, 在Inside JVM和JVM Spec的7.13节当中,finally都是通过jsr和ret指令实现的,按照书中的说法,hopAround()方法将被编译成47个jvm指令,如下所示:

    代码2:
    /**//*
    *copiedfrom
    http://www.artima.com/insidejvm/applets/HopAround.html
    */


    0iconst_0//Pushconstant0
    1istore_0//Popintolocalvar0:inti=0;

    //Bothtryblocksstarthere(seeexceptiontable,below):
    2iconst_1//Pushconstant1
    3istore_0//Popintolocalvar0:i=1;
    4jsr18//Jumptomini-subroutineatoffset18(the
    //firstfinallyclause)
    7goto24//Jumptooffset24(tojustbelowfirst
    //finallyclause)

    //Catchclauseforthefirstfinallyclause:
    10astore4//Popthereferencetothrownexception,store
    //inlocalvariable4
    12jsr18//Jumptomini-subroutineatoffset18(the
    //firstfinallyclause)
    15aload4//Pushthereference(tothrownexception)
    //fromlocalvariable4
    17athrow//Rethrowthesameexception

    //Thefirstfinallyclause:
    18astore5//Storethereturnaddressinlocalvariable5
    20iconst_2//Pushconstant2
    21istore_0//Popintolocalvar0:i=2;
    22ret5//Jumptoreturnaddressstoredinlocalvariable5

    //Bytecodesforthecodejustafterthefirstfinallyclause:
    24iconst_3//Pushconstant3
    25istore_0//Popintolocalvar0:inti=3;

    //Bytecodesforthereturnstatment:
    26iload_0//Pushtheintfromlocal
    //variable0(i,whichis3)
    27istore_1//Popandstoretheintintolocal
    //variable1(thereturnvalue,i)
    28jsr39//Jumptomini-subroutineatoffset39(the
    //secondfinallyclause)
    31iload_1//Pushtheintfromlocalvariable1(the
    //returnvalue)
    32ireturn//Returntheintonthetopofthestack

    //Catchclauseforthesecondfinallyclause:
    33astore_2//Popthereferencetothrownexception,store
    //inlocalvariable2
    34jsr39//Jumptomini-subroutineatoffset39(the
    //secondfinallyclause)
    37aload_2//Pushthereference(tothrownexception)
    //fromlocalvariable2
    38athrow//Rethrowthesameexception

    //Thesecondfinallyclause:
    39astore_3//Storethereturnaddressinlocalvariable3
    40iload_0//Pushtheintfromlocalvariable0(i)
    41iconst_3//Pushconstant3
    42if_icmpeq47//Ifthetoptwointsonthestackareequal,jump
    //tooffset47:if(i==3){
    45ret3//Jumptoreturnaddressstoredinlocalvariable3
    47goto2//Jumptooffset2(thetopofthewhile
    //block):continue;

    但是如果用Sun JDK 1.4之后的编译器编译,这段程序实际上被编译成截然不同的38个jvm指令(如下所示),其主要区别是finally 子句被inline到了正常代码和exception handling代码,避免了jsr/ret, 从而减少了JSR跳转/pop出栈/ret返回三条指令,在本例中,不但提高了运行效率,还减少了class文件的大小,其代价是finally block之中的内容被复制到了两个地方,如果finally block的指令很多,class文件可能会变大。

    代码3:
    staticinthopAround();
    Code:
    0:iconst_0//pushconst0
    1:istore_0//popintolocalvar0:i=0

    //startbothtryblock
    2:iconst_1//pushconst1
    3:istore_0//popintoi

    //startfirstfinallyblock(itisinlined)
    4:iconst_2//pushconst2
    5:istore_0//popintolocalvar0(i)
    6:goto14//skipexceptionhandling

    //startexceptionhandlingforsecondtryblock
    9:astore_1//popthrownexceptionreferenceintolocalvar1
    //startfirstfinallyblock(inlineagain)
    10:iconst_2//pushconst2
    11:istore_0//popinto0
    12:aload_1//pushthereference(theexception)fromlocalvar1
    13:athrow//throwexeption

    //goonthefirsttryblock
    14:iconst_3//pushconst3
    15:istore_0//popintolocalvar0(i)
    16:iload_0//pushvaluefromlocalvar0(i)
    17:istore_1//popintolocalvar1(returnvalue)

    //startsecondfinallyblock(inlined)
    18:iload_0//pushvaluefromlocalvar0(i)
    19:iconst_3//pushconst3
    20:if_icmpne26//ifthetoptwointsonthestackarenotequal,jumpto26
    23:goto2//loop

    //goonthefirsttryblock
    26:iload_1//pushvaluefromlocalvar1(returnvalue)
    27:ireturn//returnmethod

    //startexceptionhandlingforfirsttryblock
    28:astore_2//popthrownexceptionreferenceintolocalvar2
    //startsecondfinallyblock(inlinedagain)
    29:iload_0//pushvaluefromlocalvar0(i)
    30:iconst_3//pushconst3
    31:if_icmpne37//ifthetoptwointsonthestackarenotequal,jumpto37
    34:goto2//loop
    37:aload_2//pushthereference(theexception)fromlocalvar2
    38:athrow//throwexception

    Exceptiontable:
    fromtotargettype
    249any
    9109any
    21828any
    282928any



    Eclipse编译器显然也将finally inline了,Eclipse 3.2甚至disable了编译器不inline finally的选项,ECJ编译出来的hopAround()由39条指令组成:

    代码4:
    staticinthopAround();
    Code:
    0:iconst_0
    1:istore_0

    //startbothtry
    2:iconst_1
    3:istore_0

    //skipexceptionhandling
    4:goto12

    //exceptionhandlingforfirsttryblock
    7:astore_1
    //firstfinallyblockinlined
    8:iconst_2
    9:istore_0
    10:aload_1
    11:athrow

    //firstfinallyblockinlinedagain
    12:iconst_2
    13:istore_0

    //goonsecondtryblock
    14:iconst_3
    15:istore_0
    16:iload_0
    17:istore_3

    //secondfinallyblockinlined
    18:iload_0
    19:iconst_3
    20:if_icmpne26
    23:goto2

    //return
    26:iload_3
    27:ireturn

    //exceptionhandlingforsecondtry
    28:astore_2
    //secondefinallyinlined
    29:iload_0
    30:iconst_3
    31:if_icmpne37
    34:goto2
    37:aload_2
    38:athrow

    //whatdoesthismean?
    39:goto2
    Exceptiontable:
    fromtotargettype
    277any
    21828any


    区别不大,Eclipse编译器将exception handling的代码放在了正常路径的finally block之前,多出来的一句是第39句goto 2, 比较匪夷所思, 因为这一句显然是无法被执行到的。还有一个区别是exception table缩减为两项,少掉的两条是针对exception handling代码自身的,Sun javac加上的这两条意欲何为也有点让人迷惑...也许因为这个原因,ECJ编译出来的class要稍微小一些(对于这个class, 222bytes vs. 235bytes)。

    这两种主流Java编译器都对finally做了inline处理,所以我们在平常写java代码的时候应该注意在try/catch/finally里面不要做太多的分支,并且finally block中包含的内容尽量不要太多,否则class文件可能会多占用不少空间。

    还有一个tips: javac和Eclipse编译器缺省都带有debug信息,加上-g:none选项之后,class文件要小一半,对于Eclipse编译器尤其明显。

    最后一个tips送给有耐心读到这里的人: 请代码3中的14-17行,在进入finally block之前,JVM将把变量i当前的值存入另外一个本地变量(istore_1),并且在26-27行将此值返回,所以如果在finally block中修改了i的值,对返回值是没有影响的,如果要将修改过的i返回,请在finally中直接return i。更多finally实现的细节请参考Inside JVM:).
    展开全文
  • Java编译器

    2020-07-11 11:36:02
    我这边推荐的是DJ Java Decompiler这款工具,直接baidu下载,里面自带jad.exe文件。它是一款可将编译过的CLASS文件编译还原成为Java原始文件的Java编译器,并将其保存为文本文件,无需另外安装JVM或是Java SDK的...

    我这边推荐的是DJ Java Decompiler这款工具,直接baidu下载,里面自带jad.exe文件。它是一款可将编译过的CLASS文件编译还原成为Java原始文件的Java反编译器,并将其保存为文本文件,无需另外安装JVM或是Java SDK的工具模组即可使用。DJ Java Decompiler还可以检测您编辑的代码是不是有问题,将编辑的类文件加载到分析的区域。设置自动调试,这样就可以立即看到您编辑的源代码,通过源代码的分析就可以轻松找到损坏的代码,然后立即编译器将代码修复就可以了。

    使用方法:

    1.先把需要反编译的jar包如:hello.jar 文件解压 出来;
    2.在cmd命令下面执行反编译脚本 命令: 
    C:\Users\Administrator>jad -o -r -dG:\file\jar\ymy\dec -sjava G:\file\jar\ymy\hello\**\*.class

    展开全文
  • 推荐一款Java编译器,也使用了挺久的了,感觉还是很好用,就拿出和大家分享一下。这款反编译器叫 "Java Decompiler", 由 Pavel Kouznetsov开发,目前最新版本为0.2.5.它由 C++开发,并且官方可以下载wind...

    转自:http://www.blogjava.net/xmatthew/archive/2008/10/28/237203.html

       推荐一款Java反编译器,也使用了挺久的了,感觉还是很好用,就拿出和大家分享一下。
    这款反编译器叫 "Java Decompiler", 由 Pavel Kouznetsov开发,目前最新版本为0.2.5.
    它由 C++开发,并且官方可以下载 windows、linux和苹果Mac Os三个平台的可执行程序。 本地windows版本下载

       本人之所以认为它还不错,是其有下面几个功能:
      1. 支持对整个Jar文件进行反编译,并本源代码可直接点击进行相关代码的跳转
      2. 支持众多Java编译器的反编译(支持泛型, Annotation和enum枚举类型)

    • jdk1.1.8
    • jdk1.3.1
    • jdk1.4.2
    • jdk1.5.0
    • jdk1.6.0
    • jikes-1.22
    • harmony-jdk-r533500
    • Eclipse Java Compiler v_677_R32x, 3.2.1 release
    • jrockit90_150_06

       图示:


       3. 快速查找源文件功能(Ctrl+Shift+T)


       4. 安装方便.只有600K,直接运行即可。
       5. 支持文件的拖放功能,源代码高亮显示

      当然对于反编译的效果,感觉还可以。当然在本人使用过程也出现过,编译效果不佳的情况。但从总体上来看已经让我挺满意了,呵呵。

    Good Luck!
    Yours Matthew!

    转载于:https://www.cnblogs.com/shanmao/p/3575223.html

    展开全文
  • 推荐一款Java编译器

    2009-03-23 10:25:00
    推荐一款Java编译器,也使用了挺久的了,感觉还是很好用,就拿出和大家分享一下。这款反编译器叫 "Java Decompiler", 由 Pavel Kouznetsov开发,目前最新版本为0.2.5.它由 C++开发,并且官方可以下载 windows、...

    推荐一款Java反编译器,也使用了挺久的了,感觉还是很好用,就拿出和大家分享一下。

    这款反编译器叫 "Java Decompiler", 由 Pavel Kouznetsov开发,目前最新版本为0.2.5.
    它由 C++开发,并且官方可以下载 windows、linux和苹果Mac Os三个平台的可执行程序。

       本人之所以认为它还不错,是其有下面几个功能:
    1. 支持对整个Jar文件进行反编译,并本源代码可直接点击进行相关代码的跳转
    2. 支持众多Java编译器的反编译(支持泛型, Annotation和enum枚举类型)

    • jdk1.1.8
    • jdk1.3.1
    • jdk1.4.2
    • jdk1.5.0
    • jdk1.6.0
    • jikes-1.22
    • harmony-jdk-r533500
    • Eclipse Java Compiler v_677_R32x, 3.2.1 release
    • jrockit90_150_06

       图示:


       3. 快速查找源文件功能(Ctrl+Shift+T)


       4. 安装方便.只有600K,直接运行即可。
       5. 支持文件的拖放功能,源代码高亮显示

    当然对于反编译的效果,感觉还可以。当然在本人使用过程也出现过,编译效果不佳的情况。但从总体上来看已经让我挺满意了,呵呵。

    展开全文
  • 推荐一款JAVA编译器

    千次阅读 2012-12-25 11:50:27
    JD-GUI是一款用来查看CLASS文件源代码的独立图形工具,因为是...下载地址:http://java.decompiler.free.fr/ 使用例子:(JD-GUI) 查看android高德地图API: 打开MapApi.jar包:  当然还有其它反编译工具,
  • 推荐一款java编译器

    2011-03-28 10:09:08
    个人使用比较顺手,有需要的朋友可以试试看。   eclipse插件版: http://java.decompiler.free.fr/jd-eclipse/update
  • 款反编译器叫 "Java Decompiler", 由 Pavel Kouznetsov开发,目前最新版本为0.2.5. 它由 C++开发,并且官方可以下载 windows、linux和苹果Mac Os三个平台的可执行... 支持众多Java编译器的反编译(支持泛型...
  • 推荐一款Java编译器,也使用了挺久的了,感觉还是很好用,就拿出和大家分享一下。 这款反编译器叫 "Java Decompiler", 由 Pavel Kouznetsov开发,目前最新版本为0.2.5. 它由 C++开发,并且官方可以下载windows、...
  • 推荐一个C语言在线解释器 —— dooccn 其特点是响应快,历史代码保存,输入输出便捷,我用过很多在线的解释器,其中包括 ideone、codepad 这种主流被各位大佬推荐的网站,但体验着实不好,很快就弃坑了。 ...
  • GCC(GNUCompilerCollection)官方网站:https://gcc.gnu.org/GCC有Windows移植版本,比较出名的就是MinGW和TDM-GCCGNU编译器套件(GNU Compiler Collection)包括C、C++、Objective-C、Fortran、Java、Ad...
  • 在线编译器推荐

    2014-09-15 13:39:00
    下面推荐我用过一些,目前找到另一个比较好的:fenby 1、ideone 可以在线编译盒调试C/C++,JAVA,PHP,Python,Perl,以及其他40多种编程语言。 官方网站:www.ideone.com 2、codepad codepad.org是一个提供...
  • Java编译器JD

    热门讨论 2017-02-18 16:06:43
    下面将我最常用的一个反编译软件jd-gui和jd-eclipse推荐给大家。 JD-GUI is a standalone graphical utility that displays Java source codes of ".class" files. You can browse the reconstructed source c
  • Java编译器比较

    千次阅读 2013-05-13 01:25:44
    转自:...先说结论:比起DJ Java Compiler来说,我更推荐大家使用JD-GUI或者JDeclipse。 下面是DJ Java Compiler和JD-GUI的特性详细对比。 特性 DJ Java Decompiler JD-GUI
  • JAVA编译器使用记

    千次阅读 2009-06-22 08:08:00
    用google搜索JAVA反编译,出现很多的是以下一段文字(源自http://www.blogjava.net/xmatthew/archive/2008/10/28/237203.html): 推荐一款Java编译器,也使用了挺久的了,感觉还是很好用,就拿出和大家分享一下...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 431
精华内容 172
关键字:

java编译器推荐

java 订阅