Java通过反射获取构造方法进行初始化实例实操分享及避坑指北
前言
作者在使用反射通过构造方法获取实例时,遇到了点小状况,就进行了一定的总结,一是查漏补缺并做记录备份,二是用于简单分享~
本文作者 “新程快咖员” ,转载请注明出处~
Java反射中getDeclaredConstructor和getConstructor区别?
在Java反射中,getDeclaredConstructor和getConstructor都是用于获取构造方法的方法,但有以下关键区别:
访问范围不同:
getDeclaredConstructor:可以获取类中声明的所有构造方法(包括private/protected/default/public)
- 除public修饰符外,要进行获取newInstance时必须先设置setAccessible(true);
getConstructor:只能获取public修饰的构造方法
注意:
使用getDeclaredConstructor需要考虑必要性及风险,比如: 初始化是比较重的?不应被外部访问?或者是否有专门提供获取单例方法等?
如何通过构造方法获取实例?
无参构造方法
- public修饰符? 如:public MyPublicConstructorObject()
Object targetClassInstance = targetClass.getConstructor().newInstance();
注: 也可使用getDeclaredConstructor获取构造方法
- private/protected/default修饰符?如:private MyPrivateConstructorObject() / protected MyProtectedConstructorObject() / MyDefaultConstructorObject()
Constructor<?> constructor = targetClass.getDeclaredConstructor();
constructor.setAccessible(true);
Object instance = constructor.newInstance();
具体可见源码中XXXTest#testNoArgConstructor方法
单参数构造方法 (参数值为null 如何正确传参 ?)
- public修饰符? 如:public MyPublicConstructorObject(String str)
方式一:
Object targetClassInstance = targetClass.getConstructor(String.class).newInstance((String) null);
方式二:
Object targetClassInstance = targetClass.getConstructor(String.class).newInstance(new Object[]{null});
错误示例:
Object targetClassInstance = targetClass.getConstructor(String.class).newInstance(null);
注: 也可使用getDeclaredConstructor获取构造方法
- private/protected/default修饰符?如:private MyPrivateConstructorObject(String str) / protected MyProtectedConstructorObject(String str) / MyDefaultConstructorObject(String str)
方式一:
Constructor<?> constructor = targetClass.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
Object instance = constructor.newInstance((String) null);
方式二:
Constructor<?> constructor = targetClass.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
Object instance = constructor.newInstance(new Object[]{null});
错误示例:
Constructor<?> constructor = targetClass.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
Object instance = constructor.newInstance(null);
具体可见源码中XXXTest#testSingleArgConstructorWithNull方法
单参数构造方法 (参数值不为null 如何正确传参 ?)
这里其实没什么坑了,只要学会正确使用getConstructor和getDeclaredConstructor正常传值即可。
- public修饰符? 如:public MyPublicConstructorObject(String str)
方式一:
Object targetClassInstance = targetClass.getConstructor(String.class).newInstance("aaa");
方式二:
Object targetClassInstance = targetClass.getConstructor(String.class).newInstance(new Object[]{"aaa"});
注: 也可使用getDeclaredConstructor获取构造方法
- private/protected/default修饰符?如:private MyPrivateConstructorObject(String str) / protected MyProtectedConstructorObject(String str) / MyDefaultConstructorObject(String str)
方式一:
Constructor<?> constructor = targetClass.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
Object instance = constructor.newInstance("aaa");
方式二:
Constructor<?> constructor = targetClass.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
Object instance = constructor.newInstance(new Object[]{"aaa"});
具体可见源码中XXXTest#testSingleArgConstructorWithNotNull方法
多参数构造方法 (参数值均为null 如何正确传参 ?)
这里其实没什么坑了,只要学会正确使用getConstructor和getDeclaredConstructor正常传值即可。
- public修饰符? 如:public MyPublicConstructorObject(String str, Integer number)
方式一:
Object targetClassInstance = targetClass.getConstructor(String.class, Integer.class).newInstance(null, null);
方式二:
Object targetClassInstance = targetClass.getConstructor(String.class, Integer.class).newInstance(new Object[]{null, null});
注: 也可使用getDeclaredConstructor获取构造方法
- private/protected/default修饰符?如:private MyPrivateConstructorObject(String str, Integer number) / protected MyProtectedConstructorObject(String str, Integer number) / MyDefaultConstructorObject(String str, Integer number)
方式一:
Constructor<?> constructor = targetClass.getDeclaredConstructor(String.class, Integer.class);
constructor.setAccessible(true);
Object instance = constructor.newInstance(null, null);
方式二:
Constructor<?> constructor = targetClass.getDeclaredConstructor(String.class, Integer.class);
constructor.setAccessible(true);
Object instance = constructor.newInstance(new Object[]{null, null});
具体可见源码中XXXTest#testMoreArgConstructorWithNull方法
多参数构造方法 (参数值不均为null 如何正确传参 ?)
这里其实没什么坑了,只要学会正确使用getConstructor和getDeclaredConstructor正常传值即可。
- public修饰符? 如:public MyPublicConstructorObject(String str, Integer number)
方式一:
Object targetClassInstance = targetClass.getConstructor(String.class, Integer.class).newInstance("aaa", 1);
方式二:
Object targetClassInstance = targetClass.getConstructor(String.class, Integer.class).newInstance(new Object[]{"aaa", 1);
注: 也可使用getDeclaredConstructor获取构造方法
- private/protected/default修饰符?如:private MyPrivateConstructorObject(String str, Integer number) / protected MyProtectedConstructorObject(String str, Integer number) / MyDefaultConstructorObject(String str, Integer number)
方式一:
Constructor<?> constructor = targetClass.getDeclaredConstructor(String.class, Integer.class);
constructor.setAccessible(true);
Object instance = constructor.newInstance("aaa", 1);
方式二:
Constructor<?> constructor = targetClass.getDeclaredConstructor(String.class, Integer.class);
constructor.setAccessible(true);
Object instance = constructor.newInstance(new Object[]{"aaa", 1});
具体可见源码中XXXTest#testMoreArgConstructorWithNotNull方法
插件推荐
IDEA插件MPVP(maven) 迎来2.0.x全新升级 !!!支持maven项目版本搜索(中央仓库及私服)还能快速升级maven多模块项目
框架开发大佬、中台开发大佬快来看~ Maven快速调整项目版本再也不用手敲命令啦,使用这款idea插件小白也能快速调整!!!
结尾
以上就是本篇文章的全部内容啦,感谢你的阅读和观看。如果你觉得这篇文章有所帮助,欢迎“点赞”或分享给需要的小伙伴~
注:关注公众号后发送 可免费领取项目源码~