Open msdx opened 6 years ago
原先创建实例的代码如下:
public static <T> T newInstance(Class<T> claxx) throws IllegalAccessException, InvocationTargetException, InstantiationException { Constructor<?>[] cons = claxx.getDeclaredConstructors(); for (Constructor<?> c : cons) { Class[] cls = c.getParameterTypes(); if (cls.length == 0) { c.setAccessible(true); return (T) c.newInstance(); } else { Object[] objs = new Object[cls.length]; for (int i = 0; i < cls.length; i++) { objs[i] = getDefaultPrimiticeValue(cls[i]); } c.setAccessible(true); return (T) c.newInstance(objs); } } return null; }
for 循环里是直接的 if return else return,因此并不会完成遍历,只会对获取到的第一个构造方法进行判断。 这样当类实现了 Parcelable 接口而包含了带有一个 Parcle 类型参数的构造方法的时候,获取到的第一个构造方法可能是该方法。而这时候把 null 作为参数传进去,将导致构造方法报错从而创建实例失败。
if return else return
Parcelable
Parcle
null
这里参考了 square/moshi 创建实例的实现,使用无参构造方法。当没有无参构造方法时,会通过其他机制去创建。
本次 Pull Request 包含两次提交,分别是迁移至 AndroidStudio 以及修复上述问题。
@msdx 如果不修复源码,如何避免 实现了 Parcelable 出现创建实例失败的问题呢?
@scofieldwenwen 你这个问题没有意义。
原先创建实例的代码如下:
for 循环里是直接的
if return else return
,因此并不会完成遍历,只会对获取到的第一个构造方法进行判断。 这样当类实现了Parcelable
接口而包含了带有一个Parcle
类型参数的构造方法的时候,获取到的第一个构造方法可能是该方法。而这时候把null
作为参数传进去,将导致构造方法报错从而创建实例失败。这里参考了 square/moshi 创建实例的实现,使用无参构造方法。当没有无参构造方法时,会通过其他机制去创建。
本次 Pull Request 包含两次提交,分别是迁移至 AndroidStudio 以及修复上述问题。