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

发布时间 - 2026-01-11 03:04:23    点击率:

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

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


# newInstance()方法和new关键字  # java中newInstance()方法和new关键字的对比  # Java和C++通过new创建的对象有何区别?  # 详解java创建一个女朋友类(对象啥的new一个就是)==建造者模式  # 一键重写  # Java Class.forName()用法和newInstance()方法原理解析  # 深入理解Java new String()方法  # 解决Java中new BigDecimal()的坑  # 注意Java中 new BigDecimal(double val) 的使用  # 加载  # 转换为  # 创建一个  # 第一个  # 如有  # 两种  # 把它  # 我们可以  # 给了  # 希望能  # 第二个  # 考虑到  # 谢谢大家  # 显而易见  # 最简单  # 两步  # 接了  # 再将  # 则要  # 为什么会有 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: phpredis提高消息队列的实时性方法(推荐)  EditPlus中的正则表达式实战(6)  香港服务器建站指南:免备案优势与SEO优化技巧全解析  黑客如何通过漏洞一步步攻陷网站服务器?  北京的网站制作公司有哪些,哪个视频网站最好?  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  如何在服务器上配置二级域名建站?  如何快速登录WAP自助建站平台?  想要更高端的建设网站,这些原则一定要坚持!  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  如何在云主机上快速搭建网站?  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  Android仿QQ列表左滑删除操作  Laravel用户密码怎么加密_Laravel Hash门面使用教程  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  什么是javascript作用域_全局和局部作用域有什么区别?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  香港服务器租用费用高吗?如何避免常见误区?  BootStrap整体框架之基础布局组件  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  如何在阿里云购买域名并搭建网站?  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  如何在IIS7中新建站点?详细步骤解析  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  Mybatis 中的insertOrUpdate操作  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  Android自定义控件实现温度旋转按钮效果  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  javascript中的try catch异常捕获机制用法分析  Android实现代码画虚线边框背景效果  如何获取PHP WAP自助建站系统源码?  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  jQuery validate插件功能与用法详解  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  详解jQuery中基本的动画方法  高端企业智能建站程序:SEO优化与响应式模板定制开发  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  网站制作免费,什么网站能看正片电影?  详解Android图表 MPAndroidChart折线图  如何用搬瓦工VPS快速搭建个人网站?  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  b2c电商网站制作流程,b2c水平综合的电商平台?  Laravel PHP版本要求一览_Laravel各版本环境要求对照