new和newInstance()tance()区别
1、类的加载⽅式不同
在执⾏e("")时,JVM会在classapth中去找对应的类并加载,这时JVM会执⾏该类的静态代码段。在使⽤newInstance()⽅法的时
候,必须保证这个类已经加载并且已经连接了,⽽这可以通过Class的静态⽅法forName()来完成的。
使⽤关键字new创建⼀个类的时候,这个类可以没有被加载,⼀般也不需要该类在classpath中设定,但可能需要通过classlaoder来加载。
2、所调⽤的构造⽅法不尽相同
new关键字能调⽤任何构造⽅法。
newInstance()只能调⽤⽆参构造⽅法。
3、执⾏效率不同
new关键字是强类型的,效率相对较⾼。
newInstance()是弱类型的,效率相对较低。
既然使⽤newInstance()构造对象的地⽅通过new关键字也可以创建对象,为什么⼜会使⽤newInstance()来创建对象呢?
假设定义了⼀个接⼝Door,开始的时候是⽤⽊门的,定义为⼀个类WoodenDoor,在程序⾥就要这样写Doordoor=newWoodenDoor()。假设后来⽣活条
件提⾼,换为⾃动门了,定义⼀个类AutoDoor,这时程序就要改写为Doordoor=newAutoDoor()。虽然只是改个标识符,如果这样的语句特别多,改动还是
挺⼤的。于是出现了⼯⼚模式,所有Door的实例都由DoorFactory提供,这时换⼀种门的时候,只需要把⼯⼚的⽣产模式改⼀下,还是要改⼀点代码。
⽽如果使⽤newInstance(),则可以在不改变代码的情况下,换为另外⼀种Door。具体⽅法是把Door的具体实现类的类名放到配置⽂件中,通过
newInstance()⽣成实例。这样,改变另外⼀种Door的时候,只改配置⽂件就可以了。⽰例代码如下:
StringclassName=从配置⽂件读取Door的具体实现类的类名;
Doordoor=(Door)e(className).newInstance();
再配合依赖注⼊的⽅法,就提⾼了软件的可伸缩性、可扩展性。
newInstance()的参数版本与⽆参数版本详解
通过反射创建新的类⽰例,有两种⽅式:
tance()
tance()
以下对两种调⽤⽅式给以⽐较说明:
tance()只能够调⽤⽆参的构造函数,即默认的构造函数;
tance()可以根据传⼊的参数,调⽤任意构造构造函数。
tance()抛出所有由被调⽤构造函数抛出的异常。
tance()要求被调⽤的构造函数是可见的,也即必须是public类型的;
tance()在特定的情况下,可以调⽤私有的构造函数。
ClassA(被调⽤的⽰例):
[java]
classA{
eA(){
n("A'sconstructoriscalled.");
04.}
05.
eA(inta,intb){
n("a:"+a+"b:"+b);
08.}
09.}
ClassB(调⽤者):
输⼊结果如下:
通过tance()调⽤私有构造函数:
通过tance()调⽤私有构造函数【失败】
通过tance()调⽤私有构造函数:
A'sconstructoriscalled.
a:5b:6
说明⽅法newInstanceByClassNewInstance调⽤失败,⽽⽅法newInstanceByConstructorNewInstance则调⽤成功。
如果被调⽤的类的构造函数为默认的构造函数,采⽤tance()则是⽐较好的选择,
⼀句代码就OK;如果需要调⽤类的带参构造函数、私有构造函数,
就需要采⽤tance(),两种情况视使⽤情况⽽定。
不过JavaTotorial中推荐采⽤tance()。
[java]
classB{
staticvoidmain(String[]args){
=newB();
n("通过tance()调⽤私有构造函数:");
tanceByClassNewInstance();
n("通过tance()调⽤私有构造函数:");
tanceByConstructorNewInstance();
08.}
09./*通过tance()创建新的类⽰例*/
evoidnewInstanceByClassNewInstance(){
{/*当前包名为reflect,必须使⽤全路径*/
=(A)e("reflect.A").newInstance();
13.}catch(Exceptione){
n("通过tance()调⽤私有构造函数【失败】");
15.}
16.}
17.
18./*通过tance()创建新的类⽰例*/
evoidnewInstanceByConstructorNewInstance(){
{/*可以使⽤相对路径,同⼀个包中可以不⽤带包路径*/
=e("A");
22./*以下调⽤⽆参的、私有构造函数*/
uctorc0=laredConstructor();
essible(true);
0=(A)tance();
26./*以下调⽤带参的、私有构造函数*/
uctorc1=laredConstructor(newClass[]{,});
essible(true);
1=(A)tance(newObject[]{5,6});
30.}catch(Exceptione){
tackTrace();
32.}
33.}
34.}
本文发布于:2022-12-26 14:30:31,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/34229.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |