欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-26 21:32:10
java 中newinstance()方法和new关键字的区别 * 它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。 * 那么为什么会有两...

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

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