在加载阶段,虚拟机需要完成一下事情:
- 通过一个类的全限定名称来获得此类的二进制字节流
- 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
- 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据访问接口
其实虚拟机规范的这3点并不算具体,因此虚拟机实现与具体应用的灵活度都是相当大的。
规范并没有指明二进制字节流要从一个Class文件中获取,所以开发人员玩出了很多花样,许多举足轻重的Java技术都建立在这一基础之上,例如:
- 从ZIP包中读取,最终成为日后JAR、EAR、WAR格式的基础
- 从网络中获取,这种场景最典型的应用就是Applet
- 运行时计算生成,这种场景使用最多的就是动态代理技术,java反射
- 由其他文件生成,典型场景就是JSP应用,即由JSP生成对应的class类
- 从数据库中读取,例如有些中间件服务器可以选择把程序安装到数据库中来完成程序代码在肌群间的分发