Class.forName new 和newInstance

来源:互联网 发布:java的可变参数 编辑:程序博客网 时间:2024/05/22 23:27

Class.forName实际上是运用了反射机制
学Java的时候,对于反射机制是一头雾水,通过对Class.forName的学习应该可以摸到一点门道

Class.forName(“x”)是在程序运行的时候才知道类的名字是什么,灵活性非常好,一开始不解,程序运行的时候才知道类的名字有怎么样,不是天经地义的吗,和c语言一比较就知道了,c语言必须在编译的时候就要确定要加载什么库文件,如果找不到,编译就不会通过

而java却不是这样,使用Class.forName(“xx”),返回的是一个类,表示加载这个类到jvm虚拟机里面,不管你写的这个类的名字”xx”是否正确,是可以通过编译的,至于找不找的到这个类,那就是运行的时候再去找了,
找得到,就加载,找不到,就抛出异常

Class.forName的灵活性体现在,可以动态加载和创建对象
比如想根据用户输入的字符串来创建对象
String str = 用户输入的字符串
Class t = Class.forName(str);
t.newInstance();

Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案。 例如:
class c = Class.forName(“Example”);
factory = (ExampleInterface)c.newInstance();

其中ExampleInterface是Example的接口,可以写成如下形式:
String className = “Example”;
class c = Class.forName(className);
factory = (ExampleInterface)c.newInstance();

进一步可以写成如下形式:
String className = readfromXMlConfig;//从xml 配置文件中获得字符串
class c = Class.forName(className);
factory = (ExampleInterface)c.newInstance();
上面代码已经不存在Example的类名称,它的优点是,无论Example类怎么变化,上述代码不变,甚至可以更换Example的兄弟类Example2 , Example3 , Example4……,只要他们继承ExampleInterface就可以。

现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。

从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:1、这个 类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载 java API的那个加载器。

参考微博
http://blog.chinaunix.net/uid-23251806-id-2474831.html

0 0
原创粉丝点击