Skip to content

Conversation

@msdx
Copy link

@msdx msdx commented Apr 25, 2018

原先创建实例的代码如下:

     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 作为参数传进去,将导致构造方法报错从而创建实例失败。

这里参考了 square/moshi 创建实例的实现,使用无参构造方法。当没有无参构造方法时,会通过其他机制去创建。

本次 Pull Request 包含两次提交,分别是迁移至 AndroidStudio 以及修复上述问题。

msdx added 2 commits April 25, 2018 14:55
@scofieldwenwen
Copy link

@msdx 如果不修复源码,如何避免 实现了 Parcelable 出现创建实例失败的问题呢?

@msdx
Copy link
Author

msdx commented Jun 8, 2018

@scofieldwenwen 你这个问题没有意义。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants