java编译器代码解读 java编译器命令是什么( 三 )


访问标志信息包括该Class文件是类还是接口,是否被定义成public,是否是abstract,如果是类 , 是否被声明成final 。通过上面的源代码,我们知道该文件是类并且是public 。
0x 00 21:是0×0020和0×0001的并集 。其中0×0020这个标志值涉及到字节码指令
类索引(This Class Name)
类索引用于确定类的全限定名
0×00 03 表示引用第3个常量 , 同时第3个常量引用第19个常量,查找得”com/demo/Demo” 。#3.#19
父类索引(Super Class Name)
0×00 04 同理:#4.#20(java/lang/Object)
接口索引(Interfaces)
通过上边字节码图可以看到,这个接口有2+n个字节 , 前两个字节表示的是接口数量,后面跟着就是接口的表 。我们这个类没有任何接口,所以应该是0000 。果不其然,查找字节码文件得到的就是0000 。
字段表集合(fields)
字段表用于描述类和接口中声明的变量 。这里的字段包含了类级别变量以及实例变量,但是不包括方法内部声明的局部变量 。接下来就是2+n个字段属性 。我们只有一个属性a,所以应该是0001 。查找文件果不其然是0001 。
该区域含有字段的访问标志, 访问权限, 字段的名称索引, 字段的描述符索引, 属性表
描述符的作用就是用来描述字段的数据类型、方法的参数列表和返回值 。而属性表就是为字段表和方法表提供额外信息的表结构 。对于字段来说,此处如果将字段声明为一个static final msg = "aaa"的常量 , 则字段后就会跟着一个属性表,其中存在一项名为ConstantValue,指向常量池中的一个常量 , 值为的"aaa" 。
方法(methods)
包含访问标志表, 方法名索引 , 方法描述符索引, 属性表数量,等
Attribute
0×0001 :同样的,表示有1个Attributes了 。
0x000f : #15(“SourceFile”)
0×0000 0002 attribute_length=2
0×0010 : sourcefile_index = #16(“Demo.java”)
SourceFile属性用来记录生成该Class文件的源码文件名称 。
Java命令解析以及编译器,虚拟机如何定位类1、安装JDK,配置环境变量 。不将JDK所在的目录配置到系统环境变量中,系统怎么能找到JDK中的编译器,解释器在哪呀?如果不指明JDK的bin文件夹的位置 , 在shell中是无法找到javac/java命令的 。这点就不多说了 。2、编译,解释执行Java程序 。【 javac命令/java命令】 (1) Test.java源代码 Java代码 //缺省包,该程序源代所在位置: e:/project/ Test.java public class Test{ ..... public static void main(String[] args){ ..... } }编译命令: 【javac e:/project/Test.java 】 在e:/project目录下生成了Test.class 注意: ① 如果想要将Test.class生成在指定目录下 , 可以使用javac -d命令 , 如【 javac -d c:/ e:/project/Test.java 】 在c:/目录下生成T est.class(即e:/Test.class) ② javac -cp 中的-cp并不是指定Test.java的目录 , 这一点不要误解了 。-cp/-classpath只能是指定类文件(.class文件)的路径 。上面的命令不能写成: java -cp e:/project Test.java 解释执行命令 :【 j ava -cp e:/project Test】 将调用解释器执行e:/project中的Test.class字节码 。注意: ① -cp 是指定用户类文件的位置,比如上面的Test.class的位置 。这里因为要寻找Test.class类文件,而不是Test.java源代码文件,所以要通过-cp指定 。千万没有这样的执行命令: java e:/project/Test (2) Test.java源代码 Java代码//缺省包,但源代码中引用了一个JAR包内的自定义类,这个JAR包位于c:/目录下 import net.single.util.SL; //导入自定义JAR包中的类 public class Test{ private SL aObject=new SL(); //初始化JAR中的SL类 public static void main(String[] args){ ...... } } 编译命令: 【 javac -cp c:/single.jar e:/project/Test.java】 在e:/project目录下生成了Test.class 注意: 如果当前你要编译的java文件中引用了其它的类,但该引用类的.class文件不在当前目录下(或在其他目录下,或在.zip/.jar内) , 这种情况下就需要在javac命令后面,加上-cp/-classpath参数来指明这些类的位置 。一般来说有三种指定方式: ① 绝对或相对路径:javac -cp c:/single.jar Test .java 或 javac -cp ../single.jar Test .java (其中.. 表示上一级目录)

推荐阅读