终端窗口javac编译java文件,java执行class文件注意事项

java代码如下:

public class AutoBoxingUnBoxing {
    public static void main(String[] args) {
        Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
        System.out.println(f1 == f2);
        System.out.println(f3 == f4);
    }
}

1、第一点,存储的文件名必须和类名保持一致 AutoBoxingUnBoxing.java

运行 javac命令, 文件名int和Integer自动装箱和拆箱.java和 class 名AutoBoxingUnBoxing 不一致报错

生成class文件

PS D:\Users\JourneyOfFlower\Desktop> ls                            


    目录: D:\Users\JourneyOfFlower\Desktop


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2023.06.06     20:24            224 int和Integer自动装箱和拆箱.java

编译int和Integer自动装箱和拆箱.java文件失败

D:\Users\JourneyOfFlower\Desktop\>javac .\int和Integer自动装箱和拆箱.java
.\int和Integer自动装箱和拆箱.java:1: 错误: 类AutoBoxingUnBoxing是公共的, 应在名为 AutoBoxingUnBoxing.java 的文件中声明
public class AutoBoxingUnBoxing {
       ^
1 个错误

2、将文件名改为和class名称一致

成功编译AutoBoxingUnBoxing.class

PS D:\Users\JourneyOfFlower\Desktop> javac .\AutoBoxingUnBoxing.java
PS D:\Users\JourneyOfFlower\Desktop> 

生成AutoBoxingUnBoxing.class文件

PS D:\Users\JourneyOfFlower\Desktop> ls                            


    目录: D:\Users\JourneyOfFlower\Desktop


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2023.06.06     20:26            671 AutoBoxingUnBoxing.class
-a----        2023.06.06     20:26            224 AutoBoxingUnBoxing.java

3、java class文件执行命令

成功执行

PS D:\Users\JourneyOfFlower\Desktop> java AutoBoxingUnBoxing
true
false
PS D:\Users\JourneyOfFlower\Desktop> 

powershell终端有一点坑,按 Tab 补全路径,即使文件在当前路径,仍会在路径前加 .\ 前缀,并带上后缀.class

PS D:\Users\JourneyOfFlower\Desktop> java .\AutoBoxingUnBoxing.class

4、这里需要注意两点

class文件不能带后缀名.class

PS D:\Users\JourneyOfFlower\Desktop> java AutoBoxingUnBoxing.class
错误: 找不到或无法加载主类 AutoBoxingUnBoxing.class
PS D:\Users\JourneyOfFlower\Desktop> 

class文件前不能带路径名

相对路径.\和绝对路径都不可以带,否则都会报错,提示找不到或无法加载主类

PS D:\Users\JourneyOfFlower\Desktop> java .\AutoBoxingUnBoxing
错误: 找不到或无法加载主类 .\AutoBoxingUnBoxing
PS D:\Users\JourneyOfFlower\Desktop> 
PS D:\Users\JourneyOfFlower\Desktop> java D:\Users\JourneyOfFlower\Desktop\AutoBoxingUnBoxing 
错误: 找不到或无法加载主类 D:\Users\JourneyOfFlower\Desktop\AutoBoxingUnBoxing
PS D:\Users\JourneyOfFlower\Desktop> 

5、javap命令

javap 是 Java Development Kit(JDK)提供的一个命令行工具,用于反汇编 Java 类的字节码。它可以将 Java 类的字节码文件(.class 文件)反汇编成易于阅读的文本格式,以便于开发人员进行代码分析和调试。

使用 javap 命令可以查看 Java 类的成员变量、方法、常量池等信息,以及它们的访问修饰符、参数类型、返回类型等详细信息。这些信息可以帮助开发人员理解 Java 代码的底层实现机制,以及进行性能优化和调试。

例如,以下是使用 javap 命令查看 Java 类的字节码信息的示例:

PS D:\Users\JourneyOfFlower\Desktop> javap -c .\AutoBoxingUnBoxing.class
Compiled from "AutoBoxingUnBoxing.java"
public class AutoBoxingUnBoxing {
  public AutoBoxingUnBoxing();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: bipush        100
       2: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
       5: astore_1
       6: bipush        100
       8: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      11: astore_2
      12: sipush        150
      15: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      18: astore_3
      19: sipush        150
      22: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      25: astore        4
      27: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      30: aload_1
      31: aload_2
      32: if_acmpne     39
      35: iconst_1
      36: goto          40
      39: iconst_0
      40: invokevirtual #4                  // Method java/io/PrintStream.println:(Z)V
      43: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      46: aload_3
      47: aload         4
      49: if_acmpne     56
      52: iconst_1
      53: goto          57
      56: iconst_0
      57: invokevirtual #4                  // Method java/io/PrintStream.println:(Z)V
      60: return
}
PS D:\Users\JourneyOfFlower\Desktop> 

其中,-c 参数表示反汇编成指令代码,MyClass 是要查看的 Java 类的名称。执行该命令后,将输出 AutoBoxingUnBoxing 类的字节码信息,包括成员变量、方法、常量池等信息。

需要注意的是,javap 命令只能查看已编译的 Java 类的字节码信息,而无法查看源代码。如果要查看源代码,可以使用 Java IDE(如 Eclipse、IntelliJ IDEA)或其他反编译工具。

posted @ 2023-06-06 20:51  Journey&Flower  阅读(112)  评论(0编辑  收藏  举报