class文件结构
JVM无关性
Java编译出来的class文件和其他语言例如Scala都是可以运行在JVM上的,这都是因为虚拟机识别的是二进制的文件,而不是程序员写出来的文件,而class文件从出现到现在已经比较稳定,可以看下class文件的内容,可以看到Java代码的实现。
class 的文件结构
class 文件用记事本打开是一个二进制文件,如下
它可以用 javap 命令查看编译内容,例如输入javap -c +XX.class 可以查看。其中class文件包含了以下的信息:
常量池
常量池包括字面量和符合引用,常量池包括final修饰的变量,文本字符串,声明等。符合引用则是类和接口的全限定名,字段和名称和描述符,方法和名称描述符。
方法表
存在方法属性表集合中的一个“code” 的属性里面,与字段表集合类似,如果方法表里面没有重写,方法表中不会表现出来。
字节码指令
字节码指令是Java编译时留下的汇编代码,可以通过查看反编译的代码,查看其中的实现。
异常处理
public class StreamDemo {
public void read(){
InputStream in = null;
try {
in = new FileInputStream("A.java");
}catch(FileNotFoundException e){
e.printStackTrace();
} finally {
if (null != in) {
try {
in.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
}
在编写代码时常常会遇到异常处理时会使用finally语句,保证代码的执行,而使用javap 命令查看时你会看到这样一个异常表 。from 表示上面执行的行数,to表示到哪一行,target表示如果出错了调到哪一行,type就是错误类型了。而finally的实现看上面其实就是try,catch的正常执行上,复制一份finally代码,追加到正常执行的逻辑后面,同时再复制一份到其他出口处。
总结
只是一些概念理解,具体用途看下节课