您的位置:首页 > 其它

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虚拟机启动时被标明为启动类的类

加载顺序:

父类静态成员、静态代码块——>子类静态成员、静态代码块——>父类实例成员、代码块——>父类构造函数—>子类实例成员、代码块——>子类构造函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: