Class.forName的理解
2014-06-13 13:57
309 查看
Class.forName返回的结果是一个类,它的作用是要求JVM查找并加载指定的类,
也就是说jvm会执行这个类里面的静态代码段(静态代码只在class加载的时候执行一次)。
并且当我们是用Class.forName(XX)的时候,XX并没有初始化,只是将XX的字节码读入到内存中了(只是动态的加载了XX对象),
只有我们调用了newInstance()的时候,它才会去初始化XX这个类。
A a = (A)Class.forName("package.A").newInstance();
A a = new A();
这两种方式都是实例化A,并且他们得到的效果是一样的.
那它们有什么区别呢?
new是关键字,newInstance()是一个方法.他们的区别创建对象的方式不一样,new仅仅是创建一个新类,并且它在使用的时候,
我们对A是已知的。而newInstance()采用的类加载机制,我们在使用的时候对A的情况是未知的(工厂模式)。
newInstance:弱类型,只能调用无参构造函数
new:强类型,可以调用无参构造函数也可以调用有参构造函数
什么叫反射:
反射指的是程序在运行时能够获取自身的信息.也就是只要我们给定类的名字,那么我们就可以通过反射机制来获得类的所有信息.
优点:
动态创建和编译对象
我们都知道是用一个类需要通过加装,链接和初始化这三个操作。
1.加装:由类加载器查找字节码,并将这些字节码创建一个Class对象
2.链接:验证类中的字节码,为静态域分配存储空间
3:初始化:执行静态初始化器和静态初始化块
类的初始化时机
1:创建类的实例
2:访问类或接口的静态变量
3:调用类的静态方法
4:反射
5:初始化类的子类(调用子类的静态变量,方法)
6:java虚拟机启动时被标明为启动类的类
加载顺序:
父类静态成员、静态代码块——>子类静态成员、静态代码块——>父类实例成员、代码块——>父类构造函数—>子类实例成员、代码块——>子类构造函数
也就是说jvm会执行这个类里面的静态代码段(静态代码只在class加载的时候执行一次)。
并且当我们是用Class.forName(XX)的时候,XX并没有初始化,只是将XX的字节码读入到内存中了(只是动态的加载了XX对象),
只有我们调用了newInstance()的时候,它才会去初始化XX这个类。
A a = (A)Class.forName("package.A").newInstance();
A a = new A();
这两种方式都是实例化A,并且他们得到的效果是一样的.
那它们有什么区别呢?
new是关键字,newInstance()是一个方法.他们的区别创建对象的方式不一样,new仅仅是创建一个新类,并且它在使用的时候,
我们对A是已知的。而newInstance()采用的类加载机制,我们在使用的时候对A的情况是未知的(工厂模式)。
newInstance:弱类型,只能调用无参构造函数
new:强类型,可以调用无参构造函数也可以调用有参构造函数
什么叫反射:
反射指的是程序在运行时能够获取自身的信息.也就是只要我们给定类的名字,那么我们就可以通过反射机制来获得类的所有信息.
优点:
动态创建和编译对象
我们都知道是用一个类需要通过加装,链接和初始化这三个操作。
1.加装:由类加载器查找字节码,并将这些字节码创建一个Class对象
2.链接:验证类中的字节码,为静态域分配存储空间
3:初始化:执行静态初始化器和静态初始化块
类的初始化时机
1:创建类的实例
2:访问类或接口的静态变量
3:调用类的静态方法
4:反射
5:初始化类的子类(调用子类的静态变量,方法)
6:java虚拟机启动时被标明为启动类的类
加载顺序:
父类静态成员、静态代码块——>子类静态成员、静态代码块——>父类实例成员、代码块——>父类构造函数—>子类实例成员、代码块——>子类构造函数
相关文章推荐
- class.forName()的理解
- ZT 理解class.forName()
- 理解Class.forName的含义
- JDBC模型—深入理解JDBC设计思想(探究Class.forName("DBDriver"))
- 理解class.forName()
- Class.forName函数的理解和使用(修改)
- 理解class.forName()
- 理解class.forName()
- 网上关于Class.forName的理解
- 理解class.forName
- Class.forName() 理解
- 理解class.forName()
- 理解class.forName()
- 关于Class.forName(className).newInstance()的理解
- 关于Class.forName(String str)的理解
- Class.forName()的理解
- 理解class.forName()
- 理解class.forName()
- 理解class.forName()
- 理解class.forName()