java
pushd
C:\Users\况祥彬>pushd C:desktop
C:\Users\况祥彬\Desktop>
javac
javac是用来编译.java文件的。命令行下直接输入javac可以看到大量提示信息
javac -d destdir srcFile
其中:1、-d destdir是用来指定存放编译生成的.class文件的路径。(若此选项省略,那么默认在当前目录下生成.class文件,并且没有生成包文件夹;当前目录可以用“.”来表示,即:javac -d . srcFile )
注意:添加-d选项除了可以指定编译生成的.class文件的路径外,最大的区别是可以将源文件首行的package关键字下的包名在当前路径下生成文件夹。
2、srcFile是源文件.java文件的路径。
必须进入到.java文件所在的目录下才能正确执行该文件。
有乱码 错误: 编码GBK的不可映射字符
加上 -encoding UTF-8
javap
javap主要用于帮助开发者深入了解Java编译器的机制,主要选项有:
-c 分解方法代码,即显示每个方法具体的字节码
-public | protected | package | private 用于指定显示哪种级别的类成员
-verbose 指定显示更进一步的详细信息
举例:
源码:
public enum F {
APPLE ,BANANA ,WATERMELON ;
private int value;
private F() {//默认构造器
this.value = 0;
}
private F(int value) {//带参数的构造器
this.value = value;
}
}
先 javac -encoding utf-8 F.java 然后反编译生成的F.class文件
C:\Users\况祥彬\Desktop\coding\code\Test\src\main\java>javap -v F.class
其中会输出完整的编译器在源码基础上做的很多事情。
{
public static final F APPLE;
descriptor: LF;
flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
public static final F BANANA;
descriptor: LF;
flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
public static final F WATERMELON;
descriptor: LF;
flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
public static F[] values();
descriptor: ()[LF;
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=0, args_size=0
0: getstatic #1 // Field $VALUES:[LF;
3: invokevirtual #2 // Method "[LF;".clone:()Ljava/lang/Object;
6: checkcast #3 // class "[LF;"
9: areturn
LineNumberTable:
line 1: 0
public static F valueOf(java.lang.String);
descriptor: (Ljava/lang/String;)LF;
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=1, args_size=1
0: ldc #4 // class F
2: aload_0
3: invokestatic #5 // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/la
ng/Enum;
6: checkcast #4 // class F
9: areturn
LineNumberTable:
line 1: 0
static {};
descriptor: ()V
flags: ACC_STATIC
Code:
stack=4, locals=0, args_size=0
和看的懂的字节码:
Code:
stack=4, locals=0, args_size=0
0: new #4 // class F
3: dup
4: ldc #8 // String APPLE
6: iconst_0
7: invokespecial #9 // Method "<init>":(Ljava/lang/String;I)V
10: putstatic #10 // Field APPLE:LF;
13: new #4 // class F
16: dup
17: ldc #11 // String BANANA
19: iconst_1
20: invokespecial #9 // Method "<init>":(Ljava/lang/String;I)V
23: putstatic #12 // Field BANANA:LF;
26: new #4 // class F
29: dup
30: ldc #13 // String WATERMELON
32: iconst_2
33: invokespecial #9 // Method "<init>":(Ljava/lang/String;I)V
36: putstatic #14 // Field WATERMELON:LF;
39: iconst_3
40: anewarray #4 // class F
43: dup
44: iconst_0
45: getstatic #10 // Field APPLE:LF;
48: aastore
49: dup
50: iconst_1
51: getstatic #12 // Field BANANA:LF;
54: aastore
55: dup
56: iconst_2
57: getstatic #14 // Field WATERMELON:LF;
60: aastore
61: putstatic #1 // Field $VALUES:[LF;
64: return
LineNumberTable:
line 2: 0
line 1: 39
}
idea
ctrl alt B 进入抽象方法的实现方法