什么网站做的号,小说网站签约作者应该怎么做,广水网站设计,模板网站和定制网站后缀的区别1、类的加载方式不同
在执行Class.forName(“a.class.Name”)时#xff0c;JVM会在classapth中去找对应的类并加载#xff0c;这时JVM会执行该类的静态代码段。在使用newInstance()方法的时候#xff0c;必须保证这个类已经加载并且已经连接了#xff0c;而这可以通过Clas…1、类的加载方式不同
在执行Class.forName(“a.class.Name”)时JVM会在classapth中去找对应的类并加载这时JVM会执行该类的静态代码段。在使用newInstance()方法的时候必须保证这个类已经加载并且已经连接了而这可以通过Class的静态方法forName()来完成的。使用关键字new创建一个类的时候这个类可以没有被加载一般也不需要该类在classpath中设定但可能需要通过classlaoder来加载。
2、所调用的构造方法不尽相同
new关键字能调用任何构造方法。
newInstance()只能调用无参构造方法。
3、执行效率不同
new关键字是强类型的效率相对较高。
newInstance()是弱类型的效率相对较低。
既然使用newInstance()构造对象的地方通过new关键字也可以创建对象为什么又会使用newInstance()来创建对象呢
假设定义了一个接口Door开始的时候是用木门的定义为一个类WoodenDoor在程序里就要这样写 Door door new WoodenDoor() 。假设后来生活条件提高换为自动门了定义一个类AutoDoor这时程序就要改写为 Door door new AutoDoor() 。虽然只是改个标识符如果这样的语句特别多改动还是挺大的。于是出现了工厂模式所有Door的实例都由DoorFactory提供这时换一种门的时候只需要把工厂的生产模式改一下还是要改一点代码。
而如果使用newInstance()则可以在不改变代码的情况下换为另外一种Door。具体方法是把Door的具体实现类的类名放到配置文件中通过newInstance()生成实例。这样改变另外一种Door的时候只改配置文件就可以了。示例代码如下
String className 从配置文件读取Door的具体实现类的类名;
Door door (Door) Class.forName(className).newInstance();
再配合依赖注入的方法就提高了软件的可伸缩性、可扩展性。
---------------------------------------------------
用newInstance与用new是区别的区别在于创建对象的方式不一样前者是使用类加载机制那么为什么会有两种创建对象方式这个就要从可伸缩、可扩展可重用等软件思想上解释了。Java中工厂模式经常使用newInstance来创建对象因此从为什么要使用工厂模式上也可以找到具体答案。 例如 Class c Class.forName(“A”); factory (AInterface)c.newInstance(); 其中AInterface是A的接口如果下面这样写你可能会理解 String className “A”; Class c Class.forName(className); factory (AInterface)c.newInstance(); 进一步如果下面写你可能会理解 String className readfromXMlConfig;//从xml 配置文件中获得字符串 Class c Class.forName(className);factory (AInterface)c.newInstance(); 上面代码就消灭了A类名称优点无论A类怎么变化上述代码不变甚至可以更换A的兄弟类B , C , D….等只要他们继承Ainterface就可以。 从jvm的角度看我们使用new的时候这个要new的类可以没有加载 但是使用newInstance时候就必须保证 1、这个类已经加载 2、这个类已经连接了。而完成上面两个步骤的正是class的静态方法forName方法这个静态方法调用了启动类加载器就是加载javaAPI的那个加载器。 有了上面jvm上的理解那么我们可以这样说newInstance实际上是把new这个方式分解为两步,即首先调用class的加载方法加载某个类然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性提供给了我们降耦的手段。
[补充:] newInstance: 弱类型。低效率。只能调用无参构造。 new: 强类型。相对高效。能调用任何public构造。 newInstance()是实现IOC、反射、依赖倒置 等技术方法的必然选择new 只能实现具体类的实例化不适合于接口编程。类里面就是通过这个类的默认构造函数构建了一个对象如果没有默认构造函数就抛出InstantiationException, 如果没有访问默认构造函数