我是靠谱客的博主 负责帆布鞋,最近开发中收集的这篇文章主要介绍java class文件反编译,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


java class文件反编译

 

作用:class文件是二进制字节流,对class文件进行反编译可方便查看

 

 

************************

源文件

 

Test.java

public class Test {

    public static void main(String[] args){
        String[] s={"hello","hello2"};
        System.out.println(s[0]+"  "+s[1]);

        String a="hello";
        String b="world";
        System.out.println(a+"  "+b);
    }
}

 

 

************************

idea查看字节码、反编译文件

 

idea默认集成插件:bytecode viewerbytecode decompiler,可分别用于查看字节码,反编译文件

 

bytecode viewer:view ==> show bytecode

// class version 59.0 (59)
// access flags 0x21
public class test/Test {

  // compiled from: Test.java
  // access flags 0x19
  public final static INNERCLASS java/lang/invoke/MethodHandles$Lookup java/lang/invoke/MethodHandles Lookup

  // access flags 0x1
  public <init>()V
   L0
    LINENUMBER 3 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this Ltest/Test; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x9
  public static main([Ljava/lang/String;)V
   L0
    LINENUMBER 6 L0
    ICONST_2
    ANEWARRAY java/lang/String
    DUP
    ICONST_0
    LDC "hello"
    AASTORE
    DUP
    ICONST_1
    LDC "hello2"
    AASTORE
    ASTORE 1
   L1
    LINENUMBER 7 L1
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ALOAD 1
    ICONST_0
    AALOAD
    ALOAD 1
    ICONST_1
    AALOAD
    INVOKEDYNAMIC makeConcatWithConstants(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; [
      // handle kind 0x6 : INVOKESTATIC
      java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
      // arguments:
      "u0001  u0001"
    ]
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L2
    LINENUMBER 9 L2
    LDC "hello"
    ASTORE 2
   L3
    LINENUMBER 10 L3
    LDC "world"
    ASTORE 3
   L4
    LINENUMBER 11 L4
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ALOAD 2
    ALOAD 3
    INVOKEDYNAMIC makeConcatWithConstants(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; [
      // handle kind 0x6 : INVOKESTATIC
      java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
      // arguments:
      "u0001  u0001"
    ]
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L5
    LINENUMBER 12 L5
    RETURN
   L6
    LOCALVARIABLE args [Ljava/lang/String; L0 L6 0
    LOCALVARIABLE s [Ljava/lang/String; L1 L6 1
    LOCALVARIABLE a Ljava/lang/String; L3 L6 2
    LOCALVARIABLE b Ljava/lang/String; L4 L6 3
    MAXSTACK = 4
    MAXLOCALS = 4
}

 

bytecode decompiler:out目录(java项目)target目录(springboot项目)

public class Test {
    public Test6() {
    }

    public static void main(String[] args) {
        String[] s = new String[]{"hello", "hello2"};
        System.out.println(s[0] + "  " + s[1]);
        String a = "hello";
        String b = "world";
        System.out.println(a + "  " + b);
    }
}

 

 

************************

javap 反编译字节码

 

使用javac将源文件(.java)编译为字节码文件(.class),再使用javap命令反编译class文件

 

javap

[root@centos test]# javap --help
用法: javap <options> <classes>
其中, 可能的选项包括:
  -? -h --help -help               输出此帮助消息
  -version                         版本信息
  -v  -verbose                     输出附加信息
  -l                               输出行号和本地变量表
  -public                          仅显示公共类和成员
  -protected                       显示受保护的/公共类和成员
  -package                         显示程序包/受保护的/公共类
                                   和成员 (默认)
  -p  -private                     显示所有类和成员
  -c                               对代码进行反汇编
  -s                               输出内部类型签名
  -sysinfo                         显示正在处理的类的
                                   系统信息(路径、大小、日期、SHA-256 散列)
  -constants                       显示最终常量
  --module <模块>, -m <模块>       指定包含要反汇编的类的模块
  --module-path <路径>             指定查找应用程序模块的位置
  --system <jdk>                   指定查找系统模块的位置
  --class-path <路径>              指定查找用户类文件的位置
  -classpath <路径>                指定查找用户类文件的位置
  -cp <路径>                       指定查找用户类文件的位置
  -bootclasspath <路径>            覆盖引导类文件的位置
  --multi-release <version>        指定要在多发行版 JAR 文件中使用的版本

 

示例

[root@centos test]# cat Test.java
public class Test {

    public static void main(String[] args){
        String[] s={"hello","hello2"};
        System.out.println(s[0]+"  "+s[1]);

        String a="hello";
        String b="world";
        System.out.println(a+"  "+b);
    }
}


#编译源文件Test.java,生成Test.class
[root@centos test]# javac Test.java
[root@centos test]# ls
Test.class  Test.java


#反编译Test.class
[root@centos test]# javap -c Test.class
Compiled from "Test.java"
public class Test {
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_2
       1: anewarray     #7                  // class java/lang/String
       4: dup
       5: iconst_0
       6: ldc           #9                  // String hello
       8: aastore
       9: dup
      10: iconst_1
      11: ldc           #11                 // String hello2
      13: aastore
      14: astore_1
      15: getstatic     #13                 // Field java/lang/System.out:Ljava/io/PrintStream;
      18: aload_1
      19: iconst_0
      20: aaload
      21: aload_1
      22: iconst_1
      23: aaload
      24: invokedynamic #19,  0             // InvokeDynamic #0:makeConcatWithConstants:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
      29: invokevirtual #23                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      32: ldc           #9                  // String hello
      34: astore_2
      35: ldc           #29                 // String world
      37: astore_3
      38: getstatic     #13                 // Field java/lang/System.out:Ljava/io/PrintStream;
      41: aload_2
      42: aload_3
      43: invokedynamic #19,  0             // InvokeDynamic #0:makeConcatWithConstants:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
      48: invokevirtual #23                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      51: return
}

 #7   // class java/lang/String:常量池中第7为字符串

 

 

最后

以上就是负责帆布鞋为你收集整理的java class文件反编译的全部内容,希望文章能够帮你解决java class文件反编译所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部