java newinstance

作者:原创时间:2022-04-06
文档

java newinstance是什么,让我们一起了解一下?

newInstance实例化对象是只能调用无参构造方法,接口类实现类没有构造方法,系统默认会配置无参构造,如果接口实现类有有参构造函数,则必须重写一个无参构造函数才可用newInstance。

为什么要用newInstance()方法来创建对象?

1、假设定义了一个接口Car,开始的时候开的是汽油车,定义为一个类OilCar,程序中这样写 OilCar  car= new OilCar() 。

2、后来随着全球资源枯竭,国家政策支持的原因,换成了新能源电动汽车。此时定义一个类EnergyCar,程序写成: EnergyCar       car = new EnergyCar() 。

3、如果后期汽车类型不断改变,每次都要改动,于是工厂模式出现了,而所有Car的实例都由CarFactory提供,这时如果再换一种车的时候,只需要把工厂的生产模式改一下。

 4、而如果使用newInstance(),上面3的问题又可以轻松解决。具体方法是把Car的具体实现类的类名放到配置文件中,通过               newInstance()去生成实例。这样,改变另外一种Car的时候,只需要改下配置文件就可以了。

new和newInstance的区别是什么?

类的加载方式不同:

在执行Class.forName("xxyy.class.Name")时,JVM会在classapth中去找对应的类并加载,这时JVM会执行该类的静态代码段。   

在使用newInstance()方法的时候,必须保证这个类已经加载并且已经连接了,而这可以通过Class的静态方法forName()来完成的。  

使用关键字new创建一个类的时候,这个类可以没有被加载,一般也不需要该类在classpath中设定,但可能需要通过classlaoder来加载。

所调用的构造方法不尽相同:

new关键字能调用任何构造方法。

newInstance()只能调用无参构造方法。

执行效率不同:

new关键字是强类型的,效率相对较高。

newInstance()是弱类型的,效率相对较低。

具体代码示例如下:

// Constructor lookup
        if (cachedConstructor == null) {
            if (this == Class.class) {
                throw new IllegalAccessException(
                    "Can not call newInstance() on the Class for java.lang.Class"
                );
            }
            try {
                Class[] empty = {};
                final Constructor c = getConstructor0(empty, Member.DECLARED);
                // Disable accessibility checks on the constructor
                // since we have to do the security check here anyway
                // (the stack depth is wrong for the Constructor's
                // security check to work)
                java.security.AccessController.doPrivileged(
                    new java.security.PrivilegedAction() {
                        public Void run() {
                                c.setAccessible(true);
                                return null;
                            }
                        });
                cachedConstructor = c;
            } catch (NoSuchMethodException e) {
                throw (InstantiationException)
                    new InstantiationException(getName()).initCause(e);
            }
        }

以上就是小编今天的分享了,希望可以帮助到大家。

显示全文
java nextint java nextline java nexus java nfs java geotools java getbytes java hashcode java hdfs java node类 java notify java nslookup java number java hibernate java htmlunit java image java implements java influxdb java inputstreamreader java onvif java openfire java namespace java mybatisplus java mvvm java multiset java mqtt java mono java monad java module java modelandview java mockito java mmap java mkdir java mina java mian java method java merge java memcpy java matrix java matlab java math.ceil