通过反射创建新的类示例,有两种方式: 
Class.newInstance() 
Constructor.newInstance()

以下对两种调用方式给以比较说明: 
Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数; 
Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。

Class.newInstance() 抛出所有由被调用构造函数抛出的异常。

Class.newInstance() 要求被调用的构造函数是可见的,也即必须是public类型的; 
Constructor.newInstance() 在特定的情况下,可以调用私有的构造函数。

Class A(被调用的示例):

  1. public class A {
  2. private A() {
  3. System.out.println("A's constructor is called.");
  4. }
  5. private A(int a, int b) {
  6. System.out.println("a:" + a + " b:" + b);
  7. }
  8. }

Class B(调用者):

  1. public class B {
  2. public static void main(String[] args) {
  3. B b=new B();
  4. out.println("通过Class.NewInstance()调用私有构造函数:");
  5. b.newInstanceByClassNewInstance();
  6. out.println("通过Constructor.newInstance()调用私有构造函数:");
  7. b.newInstanceByConstructorNewInstance();
  8. }
  9. /*通过Class.NewInstance()创建新的类示例*/
  10. private void newInstanceByClassNewInstance(){
  11. try {/*当前包名为reflect,必须使用全路径*/
  12. A a=(A)Class.forName("reflect.A").newInstance();
  13. } catch (Exception e) {
  14. out.println("通过Class.NewInstance()调用私有构造函数【失败】");
  15. }
  16. }
  17. /*通过Constructor.newInstance()创建新的类示例*/
  18. private void newInstanceByConstructorNewInstance(){
  19. try {/*可以使用相对路径,同一个包中可以不用带包路径*/
  20. Class c=Class.forName("A");
  21. /*以下调用无参的、私有构造函数*/
  22. Constructor c0=c.getDeclaredConstructor();
  23. c0.setAccessible(true);
  24. A a0=(A)c0.newInstance();
  25. /*以下调用带参的、私有构造函数*/
  26. Constructor c1=c.getDeclaredConstructor(new Class[]{int.class,int.class});
  27. c1.setAccessible(true);
  28. A a1=(A)c1.newInstance(new Object[]{5,6});
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. }

输入结果如下: 
通过Class.NewInstance()调用私有构造函数: 
通过Class.NewInstance()调用私有构造函数【失败】 
通过Constructor.newInstance()调用私有构造函数: 
A's constructor is called. 
a:5 b:6

说明方法newInstanceByClassNewInstance调用失败,而方法newInstanceByConstructorNewInstance则调用成功。 
如果被调用的类的构造函数为默认的构造函数,采用Class.newInstance()则是比较好的选择, 
一句代码就OK;如果是老百姓调用被调用的类带参构造函数、私有构造函数, 
就需要采用Constractor.newInstance(),两种情况视使用情况而定。 
不过Java Totorial中推荐采用Constractor.newInstance()。 

java newInstance() 的参数版本与无参数版本详解的更多相关文章

  1. WiFi无线网络参数 802.11a/b/g/n 详解

    转载自:WiFi无线网络参数 802.11a/b/g/n 详解 如转载侵犯您的版权,请联系:2378264731@qq.com 802.11a/b/g/n,其实指的是无线网络协议,细分为802.11a ...

  2. 利用 Java 操作 Jenkins API 实现对 Jenkins 的控制详解

    本文转载自利用 Java 操作 Jenkins API 实现对 Jenkins 的控制详解 导语 由于最近工作需要利用 Jenkins 远程 API 操作 Jenkins 来完成一些列操作,就抽空研究 ...

  3. Java和Ibatis调用存储过程并取得返回值详解

    Java和Ibatis调用存储过程并取得返回值详解 2011-07-19 17:33 jiandanfeng2 CSDN博客 字号:T | T 本文主要介绍了Java和Ibatis调用存储过程的方法, ...

  4. Java NIO 的前生今世 之四 NIO Selector 详解

    Selector Selector 允许一个单一的线程来操作多个 Channel. 如果我们的应用程序中使用了多个 Channel, 那么使用 Selector 很方便的实现这样的目的, 但是因为在一 ...

  5. java多态性方法的重写Overriding和重载Overloading详解

    java多态性方法的重写Overriding和重载Overloading详解 方法的重写Overriding和重载Overloading是Java多态性的不同表现.重写Overriding是父类与子类 ...

  6. Java生产环境下性能监控与调优详解视频教程 百度云 网盘

    集数合计:9章Java视频教程详情描述:A0193<Java生产环境下性能监控与调优详解视频教程>软件开发只是第一步,上线后的性能监控与调优才是更为重要的一步本课程将为你讲解如何在生产环境 ...

  7. 《手把手教你》系列基础篇(八十三)-java+ selenium自动化测试-框架设计基础-TestNG测试报告-下篇(详解教程)

    1.简介 其实前边好像简单的提到过测试报告,宏哥觉得这部分比较重要,就着重讲解和介绍一下.报告是任何测试执行中最重要的部分,因为它可以帮助用户了解测试执行的结果.失败点和失败原因.另一方面,日志记录对 ...

  8. 史上!最最最简洁明了的 Java JDK 安装目录及其子目录含义 10分钟详解 - 精简归纳

    Java JDK 安装目录及其子目录含义 10分钟详解 - 精简归纳 JERRY_Z. ~ 2020 / 8 / 30 转载请注明出处!️ 目录 Java JDK 安装目录及其子目录含义 10分钟详解 ...

  9. 深入浅出 Java JDK 安装目录及其子目录含义 10分钟详解 - 精简归纳

    Java JDK 安装目录及其子目录含义 10分钟详解 - 精简归纳 JERRY_Z. ~ 2020 / 8 / 30 转载请注明出处!️ 目录 Java JDK 安装目录及其子目录含义 10分钟详解 ...

随机推荐

  1. 自定义div 拖动。键盘上下左右键移动,ctrl+Q控制是否可以移动,ctrl+回车,返回初始状态

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  2. bzoj1677

    题解: 背包 每一个1<<i都是无限量 代码: #include<bits/stdc++.h> using namespace std; ,M=1e9; int n,dp[N] ...

  3. CLIENT_0004:Unable to find valid Kerberos ticket cache (kinit)

    背景 今天在使用JavaAPI来连接sqoop1.99.7的时候,遇到了个错误. 错误信息如下: 0 [main] WARN org.apache.hadoop.util.NativeCodeLoad ...

  4. memcached集群安装与测试

    1.上传安装包 libevent-2.0.22-stable.tar.gz memcached-1.4.24.tar.gz 2.安装libevent 创建目录 mkdir -p /apps/insta ...

  5. Elasticsearch利用scroll查询获取所有数据

    Elasticsearch有两种分页方式,一种是通过from和size条件来实现,但是该方法开销比较大,另一种是利用scroll来实现,通过scroll来实现分页获取所有的数据,下面是利用python ...

  6. 第三课 操作系统开发之x86模拟环境搭建

    前面我们讲解了主引导程序的加载过程,并且制作了虚拟软盘a.img,最终这个主引导程序也在机器中成功运行了,但是实际开发的时候,并不会如此简单,免不了调试过程,如果还像上一节中直接将软盘放到机器中去加载 ...

  7. Jordan标准形

    一.引入 前面已经指出,一切n阶矩阵A可以分成许多相似类.今要在与A相似的全体矩阵中,找出一个较简单的矩阵来作为相似类的标准形.当然以对角矩阵作为标准形最好,可惜不是每一个矩阵都能与对角矩阵相似.因此 ...

  8. 学会从后往前遍历,例 [LeetCode] Pascal's Triangle II,剑指Offer 题4

    当我们需要改变数组的值时,如果从前往后遍历,有时会带来很多麻烦,比如需要插入值,导致数组平移,或者新的值覆盖了旧有的值,但旧有的值依然需要被使用.这种情况下,有时仅仅改变一下数组的遍历方向,就会避免这 ...

  9. Loj 2008 小凸想跑步

    Loj 2008 小凸想跑步 \(S(P,p_0,p_1)<S(P,p_i,p_{i+1})\) 这个约束条件对于 \(P_x,P_y\) 是线性的,即将面积用向量叉积表示,暴力拆开,可得到 \ ...

  10. Codeforces Round #224 (Div. 2) A. Ksenia and Pan Scales

    A. Ksenia and Pan Scales time limit per test 1 second memory limit per test 256 megabytes input stan ...