当前位置: 移动技术网 > IT编程>开发语言>Java > java 中newInstance()方法和new关键字的区别

java 中newInstance()方法和new关键字的区别

2019年07月19日  | 移动技术网IT编程  | 我要评论

java 中newinstance()方法和new关键字的区别

* 它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。
* 那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。
* 我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newinstance()方法的时候,
* 就必须保证:1、这个类已经加载;2、这个类已经连接了。
* newinstance()实际上是把new这个方式分解为两步,即首先调用class加载方法加载某个类,然后实例化。
* 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forname时获得更好的灵活性,
* 提供给了一种降耦(降低耦合度)的手段。
* 最后用最简单的描述来区分new关键字和newinstance()方法的区别:
*    newinstance: 弱类型。低效率。只能调用无参构造。
*    new: 强类型。相对高效。能调用任何public构造。

代码如下:

import java.lang.reflect.invocationtargetexception; 
import java.lang.reflect.method; 
import java.lang.reflect.field; 
 
public class testinvoke { 
  public void work(){ 
    system.out.println("-----------"); 
  }  
  public testinvoke work(string a,integer b){ 
    system.out.println(a + b); 
    return this; 
  } 
  public void work(integer b, int c ){ 
    system.out.println(b + c); 
  } 
   
  public static void main(string[] args) throws securityexception, nosuchmethodexception, instantiationexception,     illegalaccessexception, illegalargumentexception, invocationtargetexception{ 
    class<?> clazz = testinvoke.class; 
    //class<?> clazz = class.forname("invoke.testinvoke"); 
    //testinvoke tinvoke = new testinvoke(); class<?> clazz = tinvoke.getclass();  
    system.out.println(clazz); 
    //如果源类的方法没有参数,则要用new class[]{} 
    method method1 = clazz.getmethod("work", new class[]{}); 
    method method2 = clazz.getmethod("work", new class[]{string.class, integer.class});  
    method method3 = clazz.getmethod("work", new class[]{integer.class, int.class}); 
    object invoketest = clazz.newinstance(); 
    /* 
     * method类的invoke(object obj,object args[])方法接收的参数必须为对象,<br/> 
     * 如果参数为基本类型数据,必须转换为相应的包装类型的对象。invoke()方法的返回值总是对象,<br/> 
     * 如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象,再将其返回<br/> 
     */ 
    //invoke方法的第一个参数是源类的实例,第二个参数是实例的值 
    object result1 = method1.invoke(invoketest, new object[]{}); 
    object result2 = method2.invoke(invoketest, new object[]{"aaaa",new integer(10)}); 
    object result3 = method3.invoke(invoketest, new object[]{3,new integer(4)}); 
    system.out.println(result1); 
    system.out.println(result2); 
    system.out.println(result3); 
 
    method[] methods = clazz.getmethods(); 
    for(method method : methods){ 
      system.out.println(method.getname()); 
    } 
     
    field[] fileds = clazz.getfields(); 
    for(field filed: fileds){ 
      system.out.println(filed.getname()); 
    } 
  } 
} 

 控制台信息:

class invoke.testinvoke
-----------
aaaa10
7
null
invoke.testinvoke@de6ced
null
work
[ljava.lang.class;@c17164
work
[ljava.lang.class;@1fb8ee3
work
[ljava.lang.class;@61de33
main
[ljava.lang.class;@14318bb
wait
[ljava.lang.class;@ca0b6
wait
[ljava.lang.class;@10b30a7
wait
[ljava.lang.class;@1a758cb
equals
[ljava.lang.class;@1b67f74
tostring
[ljava.lang.class;@69b332
hashcode
[ljava.lang.class;@173a10f
getclass
[ljava.lang.class;@530daa
notify
[ljava.lang.class;@a62fc3
notifyall
[ljava.lang.class;@89ae9e

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网