litesuits / android-lite-orm

LiteOrm is a fast, small, powerful ORM framework for Android. LiteOrm makes you do CRUD operarions on SQLite database with a sigle line of code efficiently.
http://litesuits.com?form=gorm
Apache License 2.0
1.49k stars 362 forks source link

修复创建实例失败的问题 #72

Open msdx opened 6 years ago

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

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

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

scofieldwenwen commented 6 years ago

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

msdx commented 6 years ago

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