问题背景:
在新项目版本的某个迭代的过程中,仅仅增加了一些小功能;
但是在自测过程中,缺一直报一个反射异常。
错误信息如下:
java.lang.NoSuchMethodException: com.**.TestReflectClass.<init> []
│ at java.lang.Class.getConstructor0(Class.java:2332)
│ at java.lang.Class.getDeclaredConstructor(Class.java:2170)
│ at com.blankj.utilcode.util.ReflectUtils.newInstance(ReflectUtils.java:132)
│ Caused by: com.blankj.utilcode.util.ReflectUtils$ReflectException: java.lang.NoSuchMethodException: com.relxtech.shopkeeper.ui.activity.setting.TestReflectClass.<init> []
│ at com.blankj.utilcode.util.ReflectUtils.newInstance(ReflectUtils.java:142)
│ at com.blankj.utilcode.util.ReflectUtils.newInstance(ReflectUtils.java:120)
仓促解决方案:
这日志一看就是没有找到构造方法,想都没想,直接加上类的构造方法,问题解决,大功告成
思考
可是回过头来想一下,之前版本问啥不加默认构造方法没有问题呢,顺着这个疑惑进行了排查。但是纯粹从技术帖子上并没有什么收货,心里十分确信就是反射导致的问题。
于是就对比两个版本的相关代码,发现新版本的需求中新增加了一个带参数的构造方法。我擦,好像找到问题了。
经过测试确实是这个导致的问题。
结论
在使用反射的过程中,如果类中任何构造方法都没有,那么直接反射默认的构造方法是没有问题的。
如果但凡有一个带参数的构造方法并且默认构造方法还没有声明,那么直接反射默认构造方法 是会报找不到这个方法的异常的