反射/jvm:newInstance 和 new

来源:互联网 发布:怎么把域名和空间绑定 编辑:程序博客网 时间:2024/05/29 16:21
class SamClass{private String name = " name_ Field SamClass";public SamClass(){}public SamClass(String str){this.name = str;}public String pnt(String str){return str;}}public class ClassTest {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {Class clz = Class.forName("test.j2se.Reflect.SamClass");// newInstance: 弱类型。低效率。只能调用无参构造。 SamClass sample3 = (SamClass)clz.newInstance();System.out.println(sample3.pnt("反射调用的方法")); }}

从JVM的角度看,new创建一个类的时候,这个类可以没有被加载。

但是使用newInstance()方法的时候,就必须保证:1、这个类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载java API的那个加载器。

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

    最后用最简单的描述来区分new关键字和newInstance()方法的区别:
    newInstance: 弱类型。低效率。只能调用无参构造。 即使有做强制转换
    new: 强类型。相对高效。能调用任何public构造。
原创粉丝点击