概述
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 viewer、bytecode 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文件反编译所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复