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

 更新时间:2017年09月01日 15:26:22   作者:yangactive  
这篇文章主要介绍了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

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

相关文章

  • 详解Java如何给按钮添加监视器

    详解Java如何给按钮添加监视器

    这篇文章主要介绍了详解Java如何给按钮添加监视器,使用匿名对象、实现接口、实现类、Lambda表达式、注解等,需要的朋友可以参考下
    2023-04-04
  • Java设计模式之责任链模式详解

    Java设计模式之责任链模式详解

    客户端发出一个请求,链上的对象都有机会来处理这一请求,而客户端不需要知道谁是具体的处理对象。这样就实现了请求者和接受者之间的解耦,并且在客户端可以实现动态的组合职责链。使编程更有灵活性
    2022-07-07
  • 一篇文章带你入门Java继承

    一篇文章带你入门Java继承

    这篇文章主要介绍了Java继承概念详细解读,涉及继承的概念,合成的语法等相关内容,具有一定借鉴价值,需要的朋友可以参考下
    2021-08-08
  • mybatis一对多方式实现批量插入

    mybatis一对多方式实现批量插入

    这篇文章主要介绍了mybatis一对多方式实现批量插入,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 关于JDBC的简单封装(实例讲解)

    关于JDBC的简单封装(实例讲解)

    下面小编就为大家带来一篇关于JDBC的简单封装(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 使用Java获取系统信息的常用代码整理总结

    使用Java获取系统信息的常用代码整理总结

    这篇文章主要介绍了使用Java获取系统信息的常用代码整理总结,在服务器端一般经常能够用到,欢迎收藏,需要的朋友可以参考下
    2015-11-11
  • Java实现AOP代理的三种方式详解

    Java实现AOP代理的三种方式详解

    AOP是一种设计思想,是软件设计领域中的面向切面编程,它是面向对象编程的一种补充和完善。本文将用Java实现AOP代理的三种方式,需要的可以参考一下
    2022-07-07
  • 15个高级Java多线程面试题及回答

    15个高级Java多线程面试题及回答

    这篇文章主要介绍了15个高级Java多线程面试题及回答,翻译自国外的一篇文章,这些面试题容易混淆、较难回答,需要的朋友可以参考下吧
    2014-05-05
  • Java中方法作为参数传递的方式

    Java中方法作为参数传递的方式

    这篇文章主要介绍了Java如何让方法作为参数传递,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • SpringBoot中关于static和templates的注意事项以及webjars的配置

    SpringBoot中关于static和templates的注意事项以及webjars的配置

    今天小编就为大家分享一篇关于SpringBoot中关于static和templates的注意事项以及webjars的配置,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01

最新评论