class文件全名称为
Java class文件,主要在
平台无关性和网络
移动性方面使Java更适合网络。它在平台无关性方面的任务是:为Java程序提供独立于底层主机平台的
二进制形式的服务。
通常情况下,一个平台上的二进制
可执行文件不能在其他平台上工作。而Java class文件是可以运行在任何支持Java虚拟机的硬件平台和操作系统上的二进制文件。
当编译和连接一个C++程序时,所获得的可执行
二进制文件只能在指定的硬件平台和操作系统上运行,因为这个二进制
文件包含了对目标处理器的
机器语言。而Java编译器把Java
源文件的指令翻译成
字节码,这种字节码就是Java虚拟机的“机器语言”。
与普通程序不同的是,Java程序(class文件)并不是本地的
可执行程序。当运行Java程序时,首先运行
JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。
JVM本身包含了一个ClassLoader称为
Bootstrap ClassLoader,和JVM一样,BootstrapClassLoader是用
本地代码实现的,它负责加载核心JavaClass(即所有java.*开头的类)。
另外JVM还会提供两个ClassLoader,它们都是用Java语言编写的,由BootstrapClassLoader加载;其中Extension ClassLoader负责加载扩展的Javaclass(例如所有
javax.*开头的类和存放在
JRE的
ext目录下的类)ApplicationClassLoader负责加载应用程序自身的类。
当运行一个程序的时候,JVM启动,运行bootstrap
classloader,该ClassLoader加载java核心
API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载
CLASSPATH目录
下定义的Class,这就是一个程序最基本的加载流程。
什么时候JVM会使用ClassLoader加载一个类呢?当你使用java去执行一个类,JVM使用ApplicationClassLoader加载这个类;然后如果类A引用了类B,不管是
直接引用还是用(Class.forName)引用,JVM就会找到加载类A的ClassLoader,并用这个ClassLoader来加载类B。JVM按照
运行时的有效
执行语句,来决定是否需要装载新类,从而装载尽可能少的类,这一点和编译类是不相同的。