JAVA类加载和初始化
JAVA类的加载和初始化
一、类的加载和初始化过程
JVM将类的加载分为3个步骤:
1、加载(Load):class文件创建Class对象。
2、链接(Link)
3、初始化(Initialize)
其中 链接(Link)又分3个步骤,如下图所示:
类什么时候才被初始化:
1)创建类的实例,也就是new一个对象
2)访问某个类或接口的静态变量,或者对该静态变量赋值 或者调用类的静态方法(注意:访问常量不会触发)
3)反射(Class.forName("com.lyj.load")) (注意:classLoader.loadClass只动态装载,不会初始化)
4)初始化一个类的子类(会首先初始化子类的父类)
5)JVM启动时标明的启动类.
注意:
1、类加载不一定会初始化。一个类只加载一次。
2、在初始化一个类或接口时,并不会先初始化它所实现的接口。
3、如果静态方法或变量在parent中定义,从子类进行调用,则不会初始化子类。
二 、Class.forName(className)与ClassLoader.loadClass
1、 Class.forName(className)方法,内部实际调用的方法是 Class.forName(className,true,classloader);
第2个boolean参数表示类是否需要初始化, Class.forName(className)默认是需要初始化。一旦初始化,就会触发目标对象的 static块代码执行,static参数也也会被再次初始化。
2、 ClassLoader.loadClass(className)方法,内部实际调用的方法是 ClassLoader.loadClass(className,false); 第2个 boolean参数,表示目标对象是否进行链接,false表示不进行链接
3、数据库驱动使用Class.forName(className)是为了执行静态块代码
4. Class.forName(“pacage.A”).newInstance()与 new A()的效果是一样的。但是newInstance()只能调用无参数构造器,效率低下。
最新文章
- Provider Hosted App中使用JOM问题
- 利用WCF技术降低系统之间的耦合度
- 【BZOJ】1606: [Usaco2008 Dec]Hay For Sale(背包)
- 初学JavaScript(入门一)
- Dependency Injection学习笔记
- 在/proc文件系统中增加一个目录hello,并在这个目录中增加一个文件world,文件的内容为hello world
- RocksDB介绍:一个比LevelDB更彪悍的引擎
- HDU_2046——骨牌铺放问题,递推
- [转]ActiveMQ 即时通讯服务 浅析
- openstack之horizon源码分析
- Quartz.NET 的任务调度管理工具
- a链接返回上一页
- rabbitmq之基本原理及搭建单机环境
- MySql共享锁和排它锁
- java基础系列--volatile关键字
- HDU 1007(套圈 最近点对距离)
- Codeforces Round #276 (Div. 1) E. Sign on Fence (二分答案 主席树 区间合并)
- 运行wmic命令异常:java.io.IOException: Cannot run program ";wmic";: CreateProcess error=2, ϵͳÕҲ»µ½ָ¶解决记录
- 【面向对象】用大白话扯扯那";神奇";的面向对象编程思维(二)
- java基础学习总结——线程(二)