javap和java反编译有何区别?

新农商网 全部 1009

javap和java反编译有何区别?

回复

共3条回复 我来回复
  • 北漂程序员大松
    北漂程序员大松
    这个人很懒,什么都没有留下~
    评论

    通过javap反编译只是得到汇编的指令而已,反编译过来的,有很多特殊的信息,比如字符之间的+会变为StringBuffer.append(),总之是加工了以后的代码,不能完全变回来了。

    2020-02-24 14:47:45 0条评论
  • 智享互联生活
    智享互联生活
    这个人很懒,什么都没有留下~
    评论

    1.创建一个Test.java文件,并输入内容

    public class Test{ private int m; public int inc(){ return m + 1; } }

    2.使用javac命令编译Test.java文件,得到Test.class文件

    cafe babe 0000 0034 0013 0a00 0400 0f09

    0010 0700 1107 0012 0100 016d 0100

    0100 063c 696e 6974 3e01 0003 2829

    0004 436f 6465 0100 0f4c 696e 654e

    756d 6265 7254 6162 6c65 0100 0369 6e63

    0328 2949 0100 0a53 6f75 7263 6546

    696c 6501 0009 5465 7374 2e6a 6176 610c

    0008 0c00 0500 0601 0004 5465 7374

    106a 6176 612f 6c61 6e67 2f4f 626a

    7400 2100 0300 0400 0000 0100 0200

    0600 0000 0200 0100 0700 0800 0100

    0000 1d00 0100 0100 0000 052a b700

    01b1 0000 0001 000a 0000 0006 0001 0000

    0001 000b 000c 0001 0009 0000 001f

    0001 0000 0007 2ab4 0002 0460 ac00

    0100 0a00 0000 0600 0100 0000 0400

    0d00 0000 0200 0e

    3.使用javap命令,反编译Test.class文件

    javap -v Test

    Classfile /Users/soldier/Desktop/Test.class

    Last modified 2018-9-19; size 265 bytes

    MD5 checksum 551399dd9890a81e8f8c079c6c1f364d

    Compiled from "Test.java"

    public class Test

    minor version: 0

    major version: 52

    flags: ACC_PUBLIC, ACC_SUPER

    Constant pool:

    #1 = Methodref #4.#15 // java/lang/Object."<init>":()V

    #2 = Fieldref #3.#16 // Test.m:I

    #3 = Class #17 // Test

    #4 = Class #18 // java/lang/Object

    #5 = Utf8 m

    #6 = Utf8 I

    #7 = Utf8 <init>

    #8 = Utf8 ()V

    #9 = Utf8 Code

    #10 = Utf8 LineNumberTable

    #11 = Utf8 inc

    #12 = Utf8 ()I

    #13 = Utf8 SourceFile

    #14 = Utf8 Test.java

    #15 = NameAndType #7:#8 // "<init>":()V

    #16 = NameAndType #5:#6 // m:I

    #17 = Utf8 Test

    #18 = Utf8 java/lang/Object

    {

    public Test();

    descriptor: ()V

    flags: ACC_PUBLIC

    Code:

    stack=1, locals=1, args_size=1

    0: aload_0

    1: invokespecial #1 // Method java/lang/Object."<init>":()V

    4: return

    LineNumberTable:

    line 1: 0

    public int inc();

    descriptor: ()I

    flags: ACC_PUBLIC

    Code:

    stack=2, locals=1, args_size=1

    0: aload_0

    1: getfield #2 // Field m:I

    4: iconst_1

    5: iadd

    6: ireturn

    LineNumberTable:

    line 4: 0

    }

    SourceFile: "Test.java"


    用法摘要:

    -help 帮助-l 输出行和变量的表-public 只输出public方法和域-protected 只输出public和protected类和成员-package 只输出包,public和protected类和成员,这是默认的-p -private 输出所有类和成员-s 输出内部类型签名-c 输出分解后的代码,例如,类中每一个方法内,包含java字节码的指令,-v 输出栈大小,方法参数的个数-constants 输出静态final常量

    2020-02-24 17:28:48 0条评论
  • 代码接盘侠
    代码接盘侠
    这个人很懒,什么都没有留下~
    评论

    知道区别,需要知道几个名词。

    源代码,是我们用某种语言编写的代码。

    编译是将源代码转换成二进制执行代码的过程。java中将. java源文件通过编译成二进制. class文件。

    反编译是指把二进制文件转换成源代码的过程。java提供了许多的反编译工具,例如JD-GUI图形化反编译器,在实际运用中,比较常用,还有JD-Eclipse反编译插件,JD-IntelliJ反编译插件,Jad反编译工具,XJad等等。

    反汇编是指通过读取并翻译一个可执行文件的二进制码将这个可执行文件还原成汇编语言代码。可执行文件从源代码编译过来,打开后并不能很好的识别探究。javap是jdk的自带的反解析工具,将可执行程序解析成汇编代码,更好的调试分析其中的过程。

    2020-02-24 13:49:57 0条评论