反射获取构造、创建实例

1.class对象调用newInstance方法进行实例化

Class<SunModbusProtocolSupportProvider> clazz = SunModbusProtocolSupportProvider.class;
SunModbusProtocolSupportProvider sunModbusProtocolSupportProvider = clazz.newInstance();

该方式是利用无参构造创建实例,如果无参构造修饰为私有,会报如下异常:

 也就是说不能访问私有的无参构造

2.class对象调用getConstructor方法获取构造

Constructor<SunModbusProtocolSupportProvider> constructor = clazz.getConstructor();

该方式获取的是公有构造,参数为可变参数,所以根据传的参数决定调用哪个构造,如上所示,调用的是公有的无参构造,如果无参构造被修饰为私有,会报如下异常:

 也就说找不到公有的无参构造

3.class对象调用getDeclaredConstructor方法获取构造

Constructor<SunModbusProtocolSupportProvider> declaredConstructor = clazz.getDeclaredConstructor();

该方式获取的是所有的构造方法,即私有修饰的也可以获取到,参数为可变参数,所以根据传的参数决定调用哪个构造

4.通过getDeclaredConstructor方法获取到的构造调用newInstance创建实例

Constructor<SunModbusProtocolSupportProvider> constructor = clazz.getDeclaredConstructor();
constructor.newInstance();

如果无参构造用私有修饰,会报如下异常:

 5.利用暴力反射设置为可访问即可

Constructor<SunModbusProtocolSupportProvider> constructor = clazz.getDeclaredConstructor();
constructor.setAccessible(true);
constructor.newInstance();

 

posted @ 2022-04-08 10:25  coder小白  阅读(163)  评论(0编辑  收藏  举报