通过反射创建新类示例的两种方式及比较
来源:互联网 发布:数据分析师行业前景 编辑:程序博客网 时间:2024/05/26 20:23
通过反射创建新类示例的两种方式及比较
作者BLOG:http://blog.csdn.net/fenglibing
通过反射创建新的类示例,有两种方式:
Class.newInstance()
Constructor.newInstance()
以下对两种调用方式给以比较说明:
l Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数;而Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。
l Class.newInstance() 抛出所有由被调用构造函数抛出的异常。
l Class.newInstance() 要求被调用的构造函数是可见的,也即必须是public类型的; Constructor.newInstance() 在特定的情况下,可以调用私有的构造函数。
Class A(被调用的示例):
- public class A {
- private A(){
- System.out.println("A's constructor is called.");
- }
- private A(int a,int b){
- System.out.println("a:"+a+" b:"+b);
- }
- }
Class B(调用者):
- import java.lang.reflect.Constructor;
- import static java.lang.System.out;
- public class B {
- public static void main(String[] args) {
- B b=new B();
- out.println("通过Class.NewInstance()调用私有构造函数:");
- b.newInstanceByClassNewInstance();
- out.println("通过Constructor.newInstance()调用私有构造函数:");
- b.newInstanceByConstructorNewInstance();
- }
- /*通过Class.NewInstance()创建新的类示例*/
- private void newInstanceByClassNewInstance(){
- try {
- /*当前包名为reflect,必须使用全路径*/
- A a=(A)Class.forName("reflect.A").newInstance();
- } catch (Exception e) {
- out.println("通过Class.NewInstance()调用私有构造函数【失败】");
- }
- }
- /*通过Constructor.newInstance()创建新的类示例*/
- private void newInstanceByConstructorNewInstance(){
- try {
- /*可以使用相对路径,同一个包中可以不用带包路径*/
- Class c=Class.forName("A");
- /*以下调用无参的、私有构造函数*/
- Constructor c0=c.getDeclaredConstructor();
- c0.setAccessible(true);
- A a0=(A)c0.newInstance();
- /*以下调用带参的、私有构造函数*/
- Constructor c1=c.getDeclaredConstructor(new Class[]{int.class,int.class});
- c1.setAccessible(true);
- A a1=(A)c1.newInstance(new Object[]{5,6});
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
输入结果如下:
通过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线程的两种创建方式及优劣比较
- 【JAVA多线程】-线程的两种创建方式及比较
- 线程的两种创建方式及比较
- 创建线程两种方式的比较
- 创建线程两种方式的比较
- String类的两种创建方式的比较
- java多线程总结一:线程的两种创建方式及优劣比较
- java多线程总结一:线程的两种创建方式及优劣比较
- java多线程总结一: 线程的两种创建方式及优劣比较
- java多线程总结一: 线程的两种创建方式及优劣比较
- java多线程总结一:线程的两种创建方式及优劣比较
- java多线程总结一:线程的两种创建方式及优劣比较
- java多线程总结一: 线程的两种创建方式及优劣比较
- 软件架构设计之常用架构模式
- Unity3D入门:给刚体添加作用力让它运动起来
- poj 3041Asteroids+3692Kindergarten(二分图匹配+公式补充)
- c# 通过.net自带的chart控件绘制饼图pie chart
- 进程调度 简介
- 通过反射创建新类示例的两种方式及比较
- 设计模式之6大原则
- Win7部署SharePoint后,管理中心不能新建Web应用程序
- php解析doc格式word文件的另一种方法
- 【File】简单的文本读写context.openFileInput() context.openFileOutput()
- MAC 安装CocoaPods简易教程
- 皇后娘娘居然没有怪罪,他也就省了口舌
- magento创建表与更新
- 微软Build大会发啥?一定有Win8.1升级版