对计算机而言,每个对象都有自己的信息,通常用字段的值来表示它的状态或信息,而用于描述对象所属类的信息被称为类型信息。类型信息记录了类的名称、拥有的字段、实现的方法、继承的父类或接口等信息,有了类型信息,JVM才能认识和识别对象,才能让程序富有动态性。
1.1类型信息的存储**
编译一个java的类文件会产生一个.class文件,它们之间有什么关系?
1.class文件与Java文件
Java的编译器在编译java类文件的时候,会把原有的文本文件翻译成二进制的字节码,并把这些字节码存储在.class文件中。
(1).java类中只有一个类或接口的情况下,编译后只产生一个.class文件
public class Person {
}
编写一个类Person存放在Person.java文件中,编译后可在bin目录下发现一个同名的.class的文件Person.class。编译器把编译后的Person类的字节码存放在Person.class文件中。
(2)如果Java类文件中存在内部类,编译这个文件的时候就会产生多个.class文件,并且这些.class文件(除外部类)的文件都以外部类名+$+内部类名来命名。
public class Person {
class Toll {
}
interface Communication {
public void speak();
}
}
编写一个外部类Person,并在外部类中又定义了一个内部类和一个内部接口,并将这些代码全部存放在Person.java中。编译后可在bin目录下发现三个.class文件(我的是在out目录下)
(3)如果.java文件中存在多个并行类(接口),编译的时候也会产生多个.class文件,并且这些文件都以类名来命名。
public class Person {
}
class Monkey{
}
interface Thinking{
void think();
}
编写了两个类和一个接口,并把这些类和接口存放在了Person.java文件中。编译后bin目录下存在三个.class文件。
2 .class文件结构
.class文件的内部结构如图所示:
从上表可以看出,Java类文件中的属性、方法,以及类中的常量信息都被分别存储在.class文件中。当Java在编译一个类文件时,除了翻译类文件外,还会为该类动态的添加一个共有的静态常量属性.class,这个属性记录了类的相关信息,即类型信息,他是Class类的一个实例。
**
1.2 类型信息的加载
Java提供两种类的装载模式:预先装载和按需装载。按需加载可以在程序启动的时候不用把所有类都装载到JVM中。大部分类都被延迟到使用的时候动态加载(java的运行时动态装载机制)。可以使得修改代码的时候无需全盘编译。
1.Java基础类的加载
采用预先装载机制。启动一个程序,Java会在JDK目录下找到并载入jvm.dll,然后启动虚拟机。此时会进行一些初始化操作。接着创建一个Bootstrap Loader对象,称它为启动类的装载器(C++编写),负责在虚拟机启动时一次性加载基础类。
2.含main()函数类的加载
Bootstrap Loader可以装载定义在sun.misc命名空间下的Launcher类,它有两个内部类 ExtClassLoader和AppClassLoader。 ExtClassLoader的父加载器被设置为null,表示为Bootstrap Loader,AppClassLoader的父加载器为ExtClassLoader,拥有main()函数的入口类,在程序启动时加载。
public class Boostrap {
static {
System.out.println("Bootstrap prepare!");
}
public static void main(String[] args) {<