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
- Class.forName new 和newInstance
- Class.forName()、Class.forName().newInstance() 和 New 区别
- Class.forName().newInstance()与new
- java下Class.forName(newInstance()和new比较)
- Class.forName().newInstance()和通过new得到对象的区别
- class.forname().newInstance() 和 class.forname()
- new、Class.forName、class.newInstance性能比较
- .class、Class.forName()、Class.forName().newInstance() 、New 区别!
- JAVA Class.forname newInstance new Onject
- Class.forName(),newInstance(),New 三者区别
- Class.forName()、Class.forName().newInstance() 、New 三者区别
- Class.forName()、Class.forName().newInstance() 、New 三者区别!
- Class.forName()、Class.forName().newInstance() 、New 三者区别!
- Class.forName()、Class.forName().newInstance() 、New 三者区别!
- Class.forName()、Class.forName().newInstance() 、New 三者区别!
- Class.forName()、Class.forName().newInstance() 、New 三者区别!
- Class.forName()、Class.forName().newInstance() 、New 三者区别!
- Class.forName(),Class.forName().newInstance() ,New ,类名.class,,class.forName(),,getClass()
- 护眼的RGB
- 无法打开卷直接访问
- wikioi1063 合并果子
- Linux定时任务crontab
- 蓝桥杯 按从小到大输出长度为5的二进制串
- Class.forName new 和newInstance
- java: Random 随机数组
- 191. Number of 1 Bits
- nodejs开发微博网站(二)--mongoDB数据库
- 3D游戏引擎系列二
- [5]Linux时间编程
- 捕捉Java的异常Stacktrace
- Frogger
- 关于HTTPS一篇文章就够了