命令行中 javac、java、javap 的使用详解

命令行中 javac、java、javap 的使用详解进入命令窗口,若要切换到指定目录,例如E盘下的目录,有2种方法:1)pushd[路径],此命令可将当前目录设为指定的任一个已存在的目录C:\Users\Administrator>pushde:360DownloadsE:\360Downloads>dir//显示当前目录下的目录及文件2)直接先输入e:,然后再用cd切换到指定目录1.javac

大家好,又见面了,我是你们的朋友全栈君。

进入命令窗口,若要切换到指定目录,例如 E 盘下的目录,有2种方法:

1)pushd [路径] ,此命令可将当前目录设为指定的任一个已存在的目录

C:\Users\Administrator>pushd e:360Downloads
E:0Downloads>dir  // 显示当前目录下的目录及文件

2) 直接先输入 e: ,然后再用 cd 切换到指定目录

1. javac

javac是用来编译.java文件的。命令行下直接输入javac可以看到大量提示信息,提示javac命令的用法,常用格式如下:

javac -d destdir srcFile

1、-d destdir:指定存放编译生成的 .class 文件的路径。

当前目录可以用“.”来表示,即:javac -d . srcFile;

若此选项省略,那么默认在当前目录下生成 .class 文件,并且没有生成包文件夹;如 javac JavacTest.java ,便在当前路径下生成了一个JavacTest.class的文件。

这里写图片描述

JavacTest.java 是一个首行标注了 package 的 java 文件,而此时编译的字节码文件 JavacTest.class 在硬盘上的目录并未对应它的包名,所以,使用 java com.stopTalking.test.JavacTest 运行时是无法找到该java的。会报找不到该文件错误。

注意:添加 -d 选项除了可以指定存放编译生成的 .class 文件的路径外,最大的区别是可以将源文件首行的 package 关键字下的包名在当前路径下生成文件夹。

若输入,javac –d . JavacTest.java ,那么生成的 JavacTest.class 便在当前目录下生成的包文件中了:

这里写图片描述

2、srcFile 是源文件.java文件的路径。

例如:

E:\JavaWeb_workspaces\apptest\src\com\zxk\test>javac -encoding utf-8 -d . SoftReferenceTest.java

选项 -encoding utf-8 为编译指定编码,避免中文乱码。

2. java

然后执行该字节码文件,在大部分的教材中,看到直接使用 java JavacTest 便可执行,可是我们发现出现这样的错误:

这里写图片描述

这是因为,大部分的教材使用的类是默认包名的,即源文件的第一行是没有 package 指定包名的。使用一个类,我们需要使用它的全限定类名。

所以,在命令行需加上包层次目录:java com/stopTalking/test/JavacTest,便可看到正确的结果了。

总结:使用 java 命令运行一个.class文件,需要使用该类的全限定类名,同时需要在当前路径下有该类的包层次文件夹。这就必须要求编译时使用 -d 选项,否则需要手动建立包层次文件夹。

3. javap

javap 主要用于帮助开发者深入了解 Java 编译器的机制,主要选项有:

-c:分解方法代码,即显示每个方法具体的字节码

-public | protected | package | private:用于指定显示哪种级别的类成员

-verbose:指定显示更进一步的详细信息

输入 javap -c com/zxk/test/SoftReferenceTest ,输出信息显示如下:

E:\JavaWeb_workspaces\dbBackup\src\com\zxk\test>javap -c com/zxk/test/SoftReferenceTest
Compiled from "SoftReferenceTest.java"
public class com.zxk.test.SoftReferenceTest {
  public com.zxk.test.SoftReferenceTest();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: ldc           #2                  // int 100000
       2: anewarray     #3                  // class java/lang/ref/SoftReference

       5: astore_1
       6: iconst_0
       7: istore_2
       8: iload_2
       9: aload_1
      10: arraylength
      11: if_icmpge     59
      14: new           #4                  // class com/zxk/test/Person
      17: dup
      18: new           #5                  // class java/lang/StringBuilder
      21: dup
      22: invokespecial #6                  // Method java/lang/StringBuilder."<init>":()V
      25: ldc           #7                  // String name
      27: invokevirtual #8                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      30: iload_2
      31: invokevirtual #9                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
      34: invokevirtual #10                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      37: iload_2
      38: invokespecial #11                 // Method com/zxk/test/Person."<init>":(Ljava/lang/String;I)V
      41: astore_3
      42: aload_1
      43: iload_2
      44: new           #3                  // class java/lang/ref/SoftReference

      47: dup
      48: aload_3
      49: invokespecial #12                 // Method java/lang/ref/SoftReference."<init>":(Ljava/lang/Object;)V
      52: aastore
      53: iinc          2, 1
      56: goto          8
      59: getstatic     #13                 // Field java/lang/System.out:Ljava/io/PrintStream;
      62: new           #5                  // class java/lang/StringBuilder
      65: dup
      66: invokespecial #6                  // Method java/lang/StringBuilder."<init>":()V
      69: ldc           #14                 // String 回收前:
      71: invokevirtual #8                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      74: aload_1
      75: iconst_0
      76: aaload
      77: invokevirtual #15                 // Method java/lang/ref/SoftReference.get:()Ljava/lang/Object;
      80: invokevirtual #16                 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
      83: invokevirtual #10                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      86: invokevirtual #17                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      89: invokestatic  #18                 // Method java/lang/System.gc:()V
      92: getstatic     #13                 // Field java/lang/System.out:Ljava/io/PrintStream;
      95: new           #5                  // class java/lang/StringBuilder
      98: dup
      99: invokespecial #6                  // Method java/lang/StringBuilder."<init>":()V
     102: ldc           #19                 // String 回收后:
     104: invokevirtual #8                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
     107: aload_1
     108: iconst_0
     109: aaload
     110: invokevirtual #15                 // Method java/lang/ref/SoftReference.get:()Ljava/lang/Object;
     113: invokevirtual #16                 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
     116: invokevirtual #10                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
     119: invokevirtual #17                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
     122: return
}


参考原文:

windows命令行中java和javac、javap使用详解(java编译命令)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/140399.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 跨链协议ChainBridge简明教程【EVM/Substrate】「建议收藏」

    跨链协议ChainBridge简明教程【EVM/Substrate】「建议收藏」ChainBridge是一个可扩展的跨链通信协议,目前兼容EMV和Substrate链,支持两个不同的EVM区块链、或者一个EVM链与一个Substrate链之间的跨链桥接与通证转移,支持ERC20、ERC721等多种类型的通证的跨链转移,以及普通数据的跨链转移。在这个教程中,我们将介绍ChainBridge的基本构成和安装方法,并利用ChainBridge实现Substrate原生资产和以太坊ERC20/ERC721通证之间的跨链转移。用自己熟悉的语言学习以太坊开发:Java|Php|

  • 软件架构与设计模式_软件架构设计

    软件架构与设计模式_软件架构设计什么是架构?软件体系结构通常被称为架构,指可以预制和可重构的软件框架结构。架构尚处在发展期,对于其定义,学术界尚未形成一个统一的意见,而不同角度的视点也会造成软件体系结构的不同理解,以下是一些主流的标准观点。ANSI/IEEE610.12-1990软件工程标准词汇对于体系结构定义是:“体系架构是以构件、构件之间的关系、构件与环境之间的关系为内容的某一系统的基本组…

  • linux(1)Mac上传文件到Linux服务器

    linux(1)Mac上传文件到Linux服务器前言我们使用mac时,想让本地文件上传至服务器,该怎么办呢windows系统,我们可以使用xftp或者rz命令,那么mac呢?mac系统,我们可以使用sftp、scp或者rz命令,本文介绍sft

  • spi总线协议及spi时序图详解_奔创spi

    spi总线协议及spi时序图详解_奔创spi大家好,我是无际。上个章节我们讲解了spi接口定义,今天我们更加深入讲解下spi协议时序图和spi四种模式的用法。刚开始接触单片机开发时,最怕就是看时序图,对于我来说就是奇怪的知识。特别是SPI和IIC的,以前写程序都直接复制别人程序,功能实现就行了也没去研究过数据传输的时候时序具体是怎么样的。那个时候经验也不足,网上搜的资料说的都太学术化了,也看不懂。后面项目做多了,发现最常用到的通信总线无非就是SPI、IIC、USART、CAN、单口通信。理解也慢慢深刻了,现在去分析时序图也更加

  • js中的prototype有什么作用?[通俗易懂]

    js中的prototype有什么作用?[通俗易懂]1、prototype对象是实现面向对象的一个重要机制。每个函数也是一个对象,它们对应的类就是function,每个函数对象都具有一个子对象prototype。Prototype表示了该函数的原型,prototype表示了一个类的属性的集合。当通过new来生成一个类的对象时,prototype对象的属性就会成为实例化对象的属性。下面以一个例子来介绍prototype的应用,代码如下:123456…

  • 点云处理算法整理(超详细教程)

    点云处理算法整理(超详细教程)

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号