1、命令行中 javac

1.1、javac-概述

把.java文件编译为.class文件

1.2、javac-语法

  1. 1、语法:javac [ options ] [ sourcefiles ] [ @files ]
  2. 1.1、参数选项:
  3. 1.1.1option:命令行选项
  4. 1.1.2sourcefiles :一个或多个要编译的源文件
  5. 1.1.3@files一个或多个对源文件进行列表的文件
  6. 2javac 或者javac -help命令,系统会提示javac的所有用法

1.3、javac-相关命令

  1. 1javac -d destdir srcFile
  2. 1.1、-d destdir:指定存放编译生成的 .class 文件的路径;当前目录可以用"."来表示。
  3. 1.2srcFile:源文件.java文件所在路径。
  4. 1.3、可以指定编码防止乱码
  5. 1.3.1、比如:javac -encoding utf-8 -d . xxxx.java

2、命令行中javap

2.1、javap-概述

根据class字节码文件,反解析出当前类对应的code区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等等信息。

2.2、javap-相关命令

  1. javap -v classxx,不仅会输出行号、本地变量表信息、反编译汇编代码,还会输出当前类用到的常量池等信息。
  2. javap -l 会输出行号和本地变量表信息。
  3. javap -c 会对当前class字节码进行反编译生成汇编代码。

3、javac|javap命令-demo

3.1、新建所需执行的类

  1. ###父类
  2. public class Pair<T> {
  3. private T value;
  4. public T getValue() {
  5. return value;
  6. }
  7. public void setValue(T value) {
  8. this.value = value;
  9. }
  10. }
  11. ###子类
  12. import java.util.Date;
  13. public class DateInteger extends Pair<Date>{
  14. @Override
  15. public void setValue(Date value) {
  16. super.setValue(value);
  17. }
  18. @Override
  19. public Date getValue() {
  20. return super.getValue();
  21. }
  22. public static void main(String[] args) {
  23. System.out.println(new DateInteger().getValue());
  24. }
  25. }

3.2、将所建类放到同一目录下

比如:C:\Users\zhouxinrong\Desktop\demo

3.3、执行javac命令

javac DateInteger.java

3.4、执行javap命令

javap -c DateInteger

3.4.1、命令执行结果示例

  1. C:\Users\zhouxinrong\Desktop\demo>javap -c DateInteger
  2. Compiled from "DateInteger.java"
  3. public class DateInteger extends Pair<java.util.Date> {
  4. public DateInteger();
  5. Code:
  6. 0: aload_0
  7. 1: invokespecial #1 // Method Pair."<init>":()V
  8. 4: return
  9. public void setValue(java.util.Date);
  10. Code:
  11. 0: aload_0
  12. 1: aload_1
  13. 2: invokespecial #2 // Method Pair.setValue:(Ljava/lang/Object;)V
  14. 5: return
  15. public java.util.Date getValue();
  16. Code:
  17. 0: aload_0
  18. 1: invokespecial #3 // Method Pair.getValue:()Ljava/lang/Object;
  19. 4: checkcast #4 // class java/util/Date
  20. 7: areturn
  21. public static void main(java.lang.String[]);
  22. Code:
  23. 0: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;
  24. 3: new #6 // class DateInteger
  25. 6: dup
  26. 7: invokespecial #7 // Method "<init>":()V
  27. 10: invokevirtual #8 // Method getValue:()Ljava/util/Date;
  28. 13: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
  29. 16: return
  30. public void setValue(java.lang.Object);
  31. Code:
  32. 0: aload_0
  33. 1: aload_1
  34. 2: checkcast #4 // class java/util/Date
  35. 5: invokevirtual #10 // Method setValue:(Ljava/util/Date;)V
  36. 8: return
  37. public java.lang.Object getValue();
  38. Code:
  39. 0: aload_0
  40. 1: invokevirtual #8 // Method getValue:()Ljava/util/Date;
  41. 4: areturn
  42. }

4、Java常用字节码指令集

https://www.yuque.com/moercheng/xgug88/nvm7tn