命令行中 javac、java、javap 的使用小结
作者:joexk
进入命令窗口,若要切换到指定目录,例如 E 盘下的目录,有2种方法:
1)pushd [路径] ,此命令可将当前目录设为指定的任一个已存在的目录
C:\Users\Administrator>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_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编译命令)
到此这篇关于命令行中 javac、java、javap 的使用详解的文章就介绍到这了,更多相关javac、java、javap使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!