Java对象创建过程
2021-12-30 16:36:12 6 举报
new一个java对象时,都发生了什么。
作者其他创作
大纲/内容
加载阶段既可以使用Java虚拟机里内置的引导类加载器来完成,也可以由用户自定义的类加载器去完成,开发人员通过定义自己的类加载器去控制字节流的获取方式(重写一个类加载器的findClass()或loadClass()方法),实现根据自己的想法来赋予应用程序获取运行代码的动态性。 可通过以下方式获取:1、·从ZIP压缩包中读取,这很常见,最终成为日后JAR、EAR、WAR格式的基础。2、从网络中获取,这种场景最典型的应用就是Web Applet。3、运行时计算生成,这种场景使用得最多的就是动态代理技术,在java.lang.reflect.Proxy中,就是用了ProxyGenerator.generateProxyClass()来为特定接口生成形式为“*$Proxy”的代理类的二进制字节流。4、由其他文件生成,典型场景是JSP应用,由JSP文件生成对应的Class文件。5、从数据库中读取,这种场景相对少见些,例如有些中间件服务器(如SAP Netweaver)可以选择把程序安装到数据库中来完成程序代码在集群间的分发。6、·可以从加密文件中获取,这是典型的防Class文件被反编译的保护措施,通过加载时解密Class文件来保障程序运行逻辑不被窥探。……………
加载(解析class文件字节流)
初始化(执行<clinit>()方法给变量赋初值)
javac
验证(检查字节流是否符合JVM规范)
转化方法区数据结构
方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
编译
解析(将常量池中符号引用替换为直接引用)
在堆中生成java.lang.Class对象
准备(分配方法区内存,并赋空值)
class字节流文件
收藏
0 条评论
下一页