为什么要用反射创建对象_Java反射创建对象的两种方式

反射在Spring等框架代码中频繁被使用到,但在我们日常做业务开发的时候就较少用的,但是通过使用反射,还是可以在很大程度上降低代码编写的复杂度和冗余度的,今天我们来聊一聊反射创建对象的方式。

一、newInstance

反射创建对象就是要调用newInstance方法,我们大家在平时自己创建对象的时候都知道要用new关键字,它就是通过调用构造函数去实例化一个对象的,那么反射也是如此,newInstance的背后就是调用构造函数。

二、获取Class类对象

假如我们在创建类A的对象的时候,就要执行new A()就可以了,用反射的时候我们也需要去获取A这个类的Class类对象才能使用反射提供的方法,然后去创建对象。

获取Class类对象的几种方式

这里我们用MyTestEntity这个类举例

  1. Class.forName("com.ctrip.market.statistic.web.MyTestEntity")
  2. MyTestEntity.class.getClassLoader().loadClass("com.ctrip.market.statistic.web.MyTestEntity")
  3. new MyTestEntity().getClass()
  4. MyTestEntity.class

效果如图:

3094f75c56d44d9160af1e4fee9b8055.png

可以看到以上四种方式获取的Class类对象都是一个地址Class@855,所以这几种方式获取Class类对象都是一致的。

三、两种反射创建对象的方式

获取到了Class类对象我们可以利用反射的方式去创建实例了。还是以MyTestEntity为例。

dbf8a77dc7ebf1ce4da3968fe2f291de.png

两种反射创建对象的方式:

1、通过构造器创建

//1、getDeclaredConstructor获取类无参构造器Constructor declaredConstructor1 = MyTestEntity.class.getDeclaredConstructor();//调用构造器的newInstance方法创建对象MyTestEntity myTestEntity = declaredConstructor1.newInstance();//2、getDeclaredConstructor获取带参的构造器Constructor declaredConstructor2 = MyTestEntity.class.getDeclaredConstructor(String.class, int.class);MyTestEntity emily = declaredConstructor2.newInstance("Emily", 10);//3、getDeclaredConstructor获取私有构造器Constructor declaredConstructor2 = MyTestEntity.class.getDeclaredConstructor(String.class, String.class);//由于是私有的构造器直接创建对象会报错can not access a member of class com.ctrip.market.statistic.web.MyTestEntity with modifiers "private"//因此需要修改访问权限declaredConstructor2.setAccessible(true);MyTestEntity emily2 = declaredConstructor2.newInstance("Emily", "女");

2、通过Class类对象直接创建

//只能调用无参构造函数MyTestEntity myTestEntity = MyTestEntity.class.newInstance();

总结:

  • 通过构造器创建对象可以调用自定义的有参构造函数,Class对象方式创建只能调用默认的无参构造函数创建对象
  • 通过构造器创建对象可以调用非public类型方法,通过修改访问权限的方式可以获取private类型的构造器去创建对象
  • Spring等框架都用的构造器的方式创建对象,更加灵活方便
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值