我是靠谱客的博主 奋斗时光,最近开发中收集的这篇文章主要介绍命令行中 javac、java、javap 的使用详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

C:UsersAdministrator>pushd e:360Downloads
E:360Downloads>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_workspacesapptestsrccomzxktest>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_workspacesdbBackupsrccomzxktest>javap -c com/zxk/test/SoftRefere
nceTest
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.ap
pend:(Ljava/lang/String;)Ljava/lang/StringBuilder;
30: iload_2
31: invokevirtual #9
// Method java/lang/StringBuilder.ap
pend:(I)Ljava/lang/StringBuilder;
34: invokevirtual #10
// Method java/lang/StringBuilder.to
String:()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/SoftReferenc
e."<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.ap
pend:(Ljava/lang/String;)Ljava/lang/StringBuilder;
74: aload_1
75: iconst_0
76: aaload
77: invokevirtual #15
// Method java/lang/ref/SoftReferenc
e.get:()Ljava/lang/Object;
80: invokevirtual #16
// Method java/lang/StringBuilder.ap
pend:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
83: invokevirtual #10
// Method java/lang/StringBuilder.to
String:()Ljava/lang/String;
86: invokevirtual #17
// Method java/io/PrintStream.printl
n:(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.ap
pend:(Ljava/lang/String;)Ljava/lang/StringBuilder;
107: aload_1
108: iconst_0
109: aaload
110: invokevirtual #15
// Method java/lang/ref/SoftReferenc
e.get:()Ljava/lang/Object;
113: invokevirtual #16
// Method java/lang/StringBuilder.ap
pend:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
116: invokevirtual #10
// Method java/lang/StringBuilder.to
String:()Ljava/lang/String;
119: invokevirtual #17
// Method java/io/PrintStream.printl
n:(Ljava/lang/String;)V
122: return
}
  •  

参考原文:

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

最后

以上就是奋斗时光为你收集整理的命令行中 javac、java、javap 的使用详解的全部内容,希望文章能够帮你解决命令行中 javac、java、javap 的使用详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部