Java反射 - 通过反射创建有参与无参构造函数的对象

一、问题分析

反射机制 : 指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有属性和方法。

反射可以创建类的对象.

newInstance()方法可以创建类的实例.那么拥有该方法除了Class类之外,还有Constructor类.

可是,Class类中的newInstance()方法只能创建默认构造器的对象,想要创建有参的构造函数还是要使用Constructor类中的newInstance(Object … initargs)方法.

那么如何获取Class类对象呢?如何获取Constructor类对象呢?


二、获取Class类对象

获取该类对象的方式有三种.对象.

  1. 对象.getClass()
  2. Class.forName(全限定类名);
  3. 类名.class
  • 获取数组的Class类对象.
    int[].class 或者 Class.forName("[I");
    String数组获取方式还可以`Class.forName("[Ljava.lang.String;");

1.getClass()方法是Object类中的方法,Object类是所有类的父类,所有创建的对象都有该方法.

2.只要获取了类的全限定名,就可以通过Class.forName(String)的形式来获取Class对象

3.类型.class是一个Class类型的对象.且类型不一定是类,例如,int.

获取了Class类对象后,就可以直接调用newInstance()方法来创建该类的对象.

Note : Class类中的newInstance()方法只能创建无参构造函数的对象.


三、获取Constructor类对象

先获取Class类对象后,可以调用getConstructor(Class<?>... parameterTypes)方法getDeclaredConstructor(Class<?>... parameterTypes)方法

这两个方法的区别是什么呢?getDeclaredConstructor()与getConstructor的区别

首先看getDeclaredConstructor(Class<?>… parameterTypes)
这个方法会返回指定参数类或接口的构造器,包括public的和非public的,当然也包括private的。
getDeclaredConstructors()的返回结果就没有参数类型的过滤了,返回类声明的所有构造函数的 Constructor对象的数组。


再来看getConstructor(Class<?>… parameterTypes)
这个方法返回的是上面那个方法返回结果的子集,只返回指定参数类型访问权限是public的构造器。
getConstructors()的返回结果同样也没有参数类型的过滤。返回类的所有公共构造函数。

知道两个方法的区别之后,就可以根据构造器的修饰符匹配调用哪个方法.(如果创建有参构造函数的对象时,需要在调用方法的参数依照构造器的类型顺序写上类型.class)

调用该方法,将会返回Constructor类对象,那么就可以调用newInstance(Object ... initargs)方法,参数传入想要传入对应构造器相应类型的参数即可.创建完成.

对于getDeclaredConstructor(Class<?> ... parameterTypes)方法可以访问私有构造器,因此对于私有构造器,仍然可以创建对象.但是在调用newInstance(Object ... initargs)方法时,需要先将反射对象的accessible标志设置为true.

四、实例演示

  1. Java反射 - [实例演示] 创建类的对象多种方式
  2. Java反射 - 创建数组实例

五、可能出现的问题

[报错信息] : java.lang.NoSuchMethodException: java.lang.Integer.< init >() - Java反射创建对象出现

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值