java newInstance() 的参数版本与无参数版本详解

newInstance() 的参数版本与无参数版本详解

博客分类:

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

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

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

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

Class A(被调用的示例):

Java代码  

  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(调用者):

Java代码  

  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()。

时间: 2025-01-02 15:23:14

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

C#进阶系列——WebApi 接口参数不再困惑:传参详解

C#进阶系列--WebApi 接口参数不再困惑:传参详解

java开源框架SpringSide3多数据源配置的方法详解

原创整理不易,转载请注明出处:java开源框架SpringSide3多数据源配置的方法详解 代码下载地址:http://www.zuidaima.com/share/1781579130801152.htm 在SpringSide 3社区中,不断有人提出多数据源配置的问题,但是时至今日却一直没有一个完美的答案.经过一个星期的折腾,我总算搞清楚了在SpringSide 3中配置多数据源的各种困难并加以解决,在这里,特地把我配置SpringSide 3项目中多数据源的过程写出来,与大家分享. 我使用

java中静态代码块的用法 static用法详解

(一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用比如main方法就必须是静态的 这是程序入口两者的区别就是:静态代码块是自动执行的;静态方法是被调用的时候才执行的.静态方法(1)在Java里,可以定义一个不需要创建对象的方法,这种方法就是

【转】Java中print、printf、println的区别详解

Java中print.printf.println的区别详解 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和print基本没什么差别,就是最后会换行 System.out.printf("the number is: d",t);参照JAVA API的定义如下:'d' 整数 结果被格式化为十进制整数'o' 整数 结果被格式化为八进制整数'x', 'X' 整数 结果被格式化为十六进制整数'e', 'E

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

Selector Selector 允许一个单一的线程来操作多个 Channel. 如果我们的应用程序中使用了多个 Channel, 那么使用 Selector 很方便的实现这样的目的, 但是因为在一个线程中使用了多个 Channel, 因此也会造成了每个 Channel 传输效率的降低.使用 Selector 的图解如下: 为了使用 Selector, 我们首先需要将 Channel 注册到 Selector 中, 随后调用 Selector 的 select()方法, 这个方法会阻塞, 直到

JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解

JAVA环境变量JAVA_HOME.CLASSPATH.PATH设置详解 Windows下JAVA用到的环境变量主要有3个,JAVA_HOME.CLASSPATH.PATH.下面逐个分析. JAVA_HOME 指向的是JDK的安装路径,如C:\jdk1.5.0_06,在这路径下你应该能够找到bin.lib等目录.值得一提的是,JDK的安装路径可以选择任意磁盘目录,不过建议你放的目录层次浅一点,如果你放的目录很深,比如x:\XXXXXX\xxxxx\XXXX\xxxx\XXXX\xxxx\XXXX

[转]JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解

[转] JAVA环境变量JAVA_HOME.CLASSPATH.PATH设置详解 - dreamman的日志 - 网易博客http://blog.163.com/dreamman_yx/blog/static/26526894200842414338201/ Windows下JAVA用到的环境变量主要有3个,JAVA_HOME.CLASSPATH.PATH.下面逐个分析. JAVA_HOME 指向的是JDK的安装路径,如C:\jdk1.5.0_06,在这路径下你应该能够找到bin.lib等目录.

“全栈2019”Java第五十七章:多态与构造方法详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第五十七章:多态与构造方法详解 下一章 "全栈2019"Java第五十八章:多态中方法返回类型可以是子类类型 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java

“全栈2019”Java第六十三章:接口与抽象方法详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第六十三章:接口与抽象方法详解 下一章 "全栈2019"Java第六十四章:接口与静态方法详解 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组&qu