【Java可执行命令】(一)编译工具javac:从源代码到字节码,深入解析Java编译工具 javac ~

这篇具有很好参考价值的文章主要介绍了【Java可执行命令】(一)编译工具javac:从源代码到字节码,深入解析Java编译工具 javac ~。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Java可执行命令】(一)编译工具javac:从源代码到字节码,深入解析Java编译工具 javac ~,# 可执行命令,java,开发语言,经验分享,后端,bash,命令模式,jvm

1️⃣ 概念

Java 编程语言的可执行命令程序 javac 是 Java Development Kit (JDK) 的一部分,旨在将 Java 源代码编译为可执行的字节码文件。javac 的设计目的是为了支持 Java 的跨平台特性,使开发人员能够编写一次代码,然后在不同的操作系统上运行。

javac 是 Java 编译器的命令行前端,它将 Java 源代码作为输入,并将其转换为可由 Java 虚拟机(JVM)执行的字节码文件。它采用的是即时编译(Just-In-Time Compilation,JIT)的方式,将高级 Java 代码转换为底层机器代码。

🔍 关于Java如何实现可移植性的基本原理,请查阅我的另一篇文章:
【Java面试题】第一期:Java基础篇,每周10道,根本停不下来~

🔍 关于什么是字节码及好处是什么,请查阅我的另一篇文章:
【Java面试题】第八期:Java进阶篇,每周10道,根本停不下来~

javac 的作用是将 Java 源代码文件编译为能够在 Java 虚拟机上执行的字节码文件(以.class为扩展名)。它起到连接源代码和虚拟机之间的桥梁,将源代码转换为可执行的中间形式。

javac 在编译过程中使用了多阶段的方法。它首先将源代码解析为抽象语法树(AST),然后对 AST 进行类型检查和语义分析,最后生成中间表示形式也即字节码文件。

2️⃣ 优势和缺点

优点

  • 跨平台性:javac 生成的字节码文件可以在任何具有兼容的 Java 虚拟机的操作系统上运行;
  • 高度可移植性:通过使用 Java 编译器,Java 开发者可以创建独立于操作系统的应用程序;
  • 自动内存管理:Java 编译器为开发者提供了自动内存管理机制(垃圾回收),减少了手动内存管理的需求。

缺点

  • 开发过程中可能出现较长的编译时间,特别是对于大型项目。

3️⃣ 使用

3.1 语法格式

javac 命令的使用语法格式如下:

javac [options] <sourcefiles> 

各项的含义如下:

  • javac: 表示要运行的Java编译器命令;
  • [options]: 表示可选的参数选项。可以在这里指定不同的编译选项来控制编译过程的行为;
  • <sourcefiles>: 表示要编译的源代码文件的名称或路径。这些源代码文件应该是以.java为扩展名的Java源代码文件。

通过使用不同的编译选项,可以自定义编译过程的行为,例如指定输出目录、调整编译级别、启用特定的警告等。同时,可以传入一个或多个源代码文件,javac将会对这些文件进行编译转换为字节码文件(以.class为扩展名)。

注意,其中的方括号[]表示选项为可选的,而尖括号<>表示需要用户根据实际情况提供相应的参数值。

javac 命令支持许多可选参数来控制编译过程和生成的字节码文件。汇总全部的可选参数如下表:

参数 说明
-g 生成所有调试信息
-g:none 不生成任何调试信息
-g:{lines,vars,source} 只生成某些调试信息
-nowarn 不生成任何警告
-verbose 输出有关编译器正在执行的操作的消息
-deprecation 输出使用已过时的 API 的源位置
-classpath <路径> 指定查找用户类文件和注释处理程序的位置
-cp <路径> 指定查找用户类文件和注释处理程序的位置
-sourcepath <路径> 指定查找输入源文件的位置
-bootclasspath <路径> 覆盖引导类文件的位置
-extdirs <目录> 覆盖所安装扩展的位置
-endorseddirs <目录> 覆盖签名的标准路径的位置
-proc:{none,only} 控制是否执行注释处理和/或编译。
-processor [,,…] 要运行的注释处理程序的名称; 绕过默认的搜索进程
-processorpath <路径> 指定查找注释处理程序的位置
-parameters 生成元数据以用于方法参数的反射
-d <目录> 指定放置生成的类文件的位置
-s <目录> 指定放置生成的源文件的位置
-h <目录> 指定放置生成的本机标头文件的位置
-implicit:{none,class} 指定是否为隐式引用文件生成类文件
-encoding <编码> 指定源文件使用的字符编码
-source <发行版> 提供与指定发行版的源兼容性
-target <发行版> 生成特定 VM 版本的类文件
-profile <配置文件> 请确保使用的 API 在指定的配置文件中可用
-version 版本信息
-help 输出标准选项的提要
-A关键字[=值] 传递给注释处理程序的选项
-X 输出非标准选项的提要
-J<标记> 直接将 <标记> 传递给运行时系统
-Werror 出现警告时终止编译
@<文件名> 从文件读取选项和文件名

可以看到命令所有的可选参数很多,读者可以根据上边表格选择所需参数来执行命令。下面主要介绍几个常用的参数:

  • -d <directory>: 指定编译后的字节码文件输出目录;
  • -classpath <path>: 指定编译时查找类、接口和包的路径;
  • -sourcepath <path>: 指定查找源文件的路径;
  • -target <version>: 指定生成的字节码文件的目标 Java 版本;
  • -g: 生成用于调试的附加信息。

3.1.1 可选参数:-d

使用 -d 指定编译后字节码文件的输出目录。

运行以下命令,使用 -d 参数 指定了编译src\com\xiaoshan\MyClass.java类之后的文件输出目录为target

javac -d target src\com\xiaoshan\MyClass.java

查看编译结果,可以看到已经正确在我指定的目录下生成了MyClass.class文件:

【Java可执行命令】(一)编译工具javac:从源代码到字节码,深入解析Java编译工具 javac ~,# 可执行命令,java,开发语言,经验分享,后端,bash,命令模式,jvm

3.1.2 可选参数:-classpath

-classpath <path> 参数用于指定编译时查找类、接口和包文件的路径。下面是使用命令的一个示例:

假设 MyClass.java 依赖于另一个名为 MyLibrary.jar 的外部库。而这个外部库文件 MyLibrary.jar 存储在 /path/to/lib 目录下。现在需要在编译源代码时,让 javac 命令能够正确找到并引用外部库。

使用 -classpath 选项来指定外部库的路径:

javac -classpath /path/to/lib/MyLibrary.jar MyClass.java

这将告诉 javac 命令在编译 MyClass.java 文件时,在 /path/to/lib 目录下查找额外的类文件。

通过使用 -classpath 选项,可以指定编译时所需的外部库或其他类文件的路径,使得 javac 命令在进行编译时能够正确找到并引用这些类文件,使用时根据实际情况将 <path> 替换为外部库或类文件的路径。

3.1.3 可选参数:-sourcepath

-sourcepath <path> 参数用于指定查找源文件的路径。下面是使用 javac -sourcepath <path> 命令的一个示例:

假设有一个名为 src 的目录,该目录包含了 Java 源代码文件。希望在编译源代码时,让 javac 命令能够正确找到并编译这些源文件。可以使用 -sourcepath 选项来指定源文件的路径:

javac -sourcepath src MyClass.java

这将告诉 javac 命令在编译过程中,在 src 目录下查找所需的源代码文件。

通过使用 -sourcepath 选项,可以指定用于查找源文件的路径,使得 javac 命令能够在进行编译时正确地找到和编译源代码文件。请根据实际情况将 <path> 替换为源代码文件的路径。

注意,<path> 可以是单个路径,也可以是多个路径,多个路径之间使用路径分隔符(: 在 Unix/Linux,; 在 Windows)分隔。

3.1.4 可选参数:-target

-target <version> 参数用于指定生成的Java字节码文件的目标版本。下面是使用 javac -target <version> 命令的一个示例:

希望将 MyClass.java 的源代码文件编译后的字节码文件的目标版本设置为 Java 8。则可以使用 -target 选项来指定目标版本:

javac -target 1.8 MyClass.java

这将告诉 javac 命令生成兼容 Java 8 的字节码文件。

通过使用 -target 选项,可以指定生成的字节码文件的目标版本,以确保与特定版本的Java运行时环境兼容。根据需要将 <version> 替换为所需的Java版本号。需要注意,只有支持该版本的 JDK 才能提供适当的目标编译器。

3.1.5 可选参数:-g

我们可以使用-g选项来生成包含调试信息的字节码文件,以便在调试程序时进行更详细的跟踪和分析。
以下是一个示例:

希望在编译 MyClass.java 文件时生成包含调试信息的字节码文件,使用 -g 选项来生成包含调试信息的字节码文件:

javac -g MyClass.java

通过使用 -g 选项,可以让 javac 命令在编译过程中生成带有调试信息的字节码文件。这将有助于在调试程序时进行变量跟踪、堆栈跟踪等操作。

4️⃣ 应用场景

javac 主要用于编译 Java 源代码文件,并生成可供 Java 虚拟机执行的字节码文件。
开发人员可以使用 javac 将 Java 代码转换成与特定硬件平台无关的中间表示,以便在不同的操作系统上运行。

5️⃣ 注意事项

  • 在使用 javac 前,需要首先安装正确版本的 JDK,并配置好相应的环境变量;
  • 确保 Java 源代码文件的扩展名为.java
  • 处理源代码时,确保源文件之间的依赖关系得到正确管理,以避免编译错误。

🌾 总结

javac 是 Java 编译器的命令行前端工具,用于将 Java 源代码文件编译成可在 Java 虚拟机上执行的字节码文件。它具有跨平台性、可移植性以及自动内存管理等优点,同时也存在较长的编译时间和性能损耗的缺点。

开发人员可以通过适当使用参数来控制编译过程和生成的字节码文件。javac 在编译过程中使用多阶段方法,从解析源代码到生成字节码文件。它在开发 Java 应用程序和跨平台开发方面有广泛应用,并且是 Java 开发人员的常用工具之一。文章来源地址https://www.toymoban.com/news/detail-587739.html

【Java可执行命令】(一)编译工具javac:从源代码到字节码,深入解析Java编译工具 javac ~,# 可执行命令,java,开发语言,经验分享,后端,bash,命令模式,jvm

到了这里,关于【Java可执行命令】(一)编译工具javac:从源代码到字节码,深入解析Java编译工具 javac ~的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ffmpeg学习 源代码编译、英伟达硬件加速

    使用cpu进行软编解码时,cpu效率低并且占用高。使用硬件加速,能够明显降低CPU的占用,参看博客 ffmpeg学习(16)AVDevice使用。 这里以使用英伟达gpu进行h264编解码加速为例说明,其他平台类似。 在windows平台直接下载官方的预编译ffmpeg、lib开发包,都已经支持了英伟达显卡硬

    2023年04月09日
    浏览(25)
  • Python反编译exe获取封装源代码

    先把exe和pyinstxtractor放在一起 会得到一个文件夹 安装解析库 一共有两个,还有个struct 用sublime打开两个文件,看到一堆二进制,其中struct是多一行的,把struct的第一行复制到前一个文件中 uncompyle6 C:UserslenovoDesktop20223102412-李凌飞exemerge_ALL_ALL_V1.0.exe_extractedmerge_ALL_ALL_V1.0

    2024年01月19日
    浏览(39)
  • X86架构下交叉编译arm64源代码

    glibc在/lib(/lib32 /lib64)目录下的.so文件为libc.so.6 glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于 glibc 囊括了几乎所有

    2023年04月21日
    浏览(36)
  • Linux Red Hat 9.0使用源代码编译安装Nginx

    目录 前言 编译安装Nginx源代码 下载安装必须的依赖项(GCC编译器,GNU make工具,PCRE库和zlib库) 创建nginx组和用户账户 进入浏览器,拉取nginx源码(Nginx 1.20.2版本) 上传到Red Hat(此处上传在/home/zyz下) 移动源码到root用户下 解压 进入nginx-1.20.2目录下 检查平台安装环境 执行

    2024年03月10日
    浏览(38)
  • 【源代码管理工具GIT】

    什么是GIT? Git是一种版本控制系统,是一种工具,用于代码的存储和版本控制 集中式和分布式 集中式:Svn : 由中央服务器统一管理代码 ,安全性差。 分布式:Git :每个电脑都有一个版本库,安全性高。 四个工作区: Workspace: 工作区,就是你平时存放项目代码的地方 Index

    2024年02月04日
    浏览(41)
  • 源代码管理工具——Git

       Git是一个开源的分布式版本控制系统,用于管理软件开发中的版本控制和协作。通过Git,开发人员可以记录文件的修改历史、协作开发,以及在多个分支上进行实验性开发。Git已成为现代软件开发中不可或缺的工具之一。 文章将从以下几点介绍Git,由于GItHub国内经常访问

    2024年02月06日
    浏览(44)
  • 银河麒麟V10 SP1 ARM编译QT源代码

    最近因为一些事情需要在银河麒麟ARM系统上[银河麒麟V10 SP1 ARM 2203 linux5.4.96-11]安装QT5.12.4版本,由于QT官方不提供ARM版的安装包,无奈只能自己手动编译源代码。 后续补充:实际上我要装的是Qt5.14.2 而不是 5.12.4,不过同样的环境下Qt5.14.2也编译成功了。 这是一篇个人笔记,对

    2024年02月05日
    浏览(42)
  • 微信群发工具-含源代码分享

    本工具可实现定制消息内容,向微信通讯录中的好友群发消息,过年过节用它群发祝福微信消息非常方便。 群发信息excel文件 可将群发信息提前编辑到Excel中,确保程序与excel表处于同一目录,运行程序即可实现群发。 1)确保groupmsg.xlsx和grpmsg.exe程序文件在同一文件夹内;

    2024年02月08日
    浏览(30)
  • 命令行编译和执行java代码

    虽然现在IDE很强大又很智能,但是平常随意写点练手的代码的时候,直接在命令行中使用vim和java命令更为方便快捷,可以做到无鼠标纯键盘的操作。 首先保证将java相关指令添加到了环境变量中; 1.编译class文件: 编译好的class文件会放置到环境当前目录 (./)中。-d命令的作用

    2024年02月02日
    浏览(25)
  • 用什么工具可以查看apk文件源代码

    APK文件的源代码可以使用以下工具查看: APK Tool: 一款开源的Android应用程序反编译工具 Dex2Jar: 一款将Android的dalvik字节码文件(.dex)转换为Java字节码文件(.jar)的工具 Jadx: 一款快速且功能强大的Android反编译工具 AndroGuard: 一款反编译、分析和安全测试Android应用程序的工具 使用这

    2024年02月11日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包