在经历上一篇抽象出了许多base类后,绑定解绑中断等冗余代码被优化掉了,但是MainActivity中还需要手动创建P(createPresenter())。所以这篇文章就用注解和代理优化掉这个步骤。在实现完后,效果是这样的
只需要一个直接就把工厂给创建了。
先看一下P工厂接口
public interface PresentFactory<V extends BaseRequestView, P extends BaseRequestPresenter<V>> { P createPresenter(); }
再看一下自定义的注解
@Inherited @Retention(RetentionPolicy.RUNTIME) public @interface CreatePresenter { Class<? extends BaseRequestPresenter> value(); }@Retention(RetentionPolicy.RUNTIME)这个注解是运行时注解,只有在标注这样一个注解之后,我们才可以用反射的方式来处理我们这个自定义的注解
@Inherited与上面那个注解配合使用,为了让反射代码检查展开工作
P工厂的实现类
看一下这个方法
public static <V extends BaseRequestView, P extends BaseRequestPresenter<V>> PresenterFactoryImpl<V, P> createFactory(Class<?> viewClazz) { CreatePresenter annotation = viewClazz.getAnnotation(CreatePresenter.class); Class<P> aClass = null; if (annotation != null) { aClass = (Class<P>) annotation.value(); } return aClass == null ? null : new PresenterFactoryImpl<>(aClass); }这就是创建工厂的方法了,通过取得注解中标注的类名@CreatePresenter(RequestPresenter.class),其中annotation.value()就是这个Class对象RequestPresenter.class了。获取了这个类对象以后,就返回一个新的工厂实现类,并且把获取的这个Class对象作为构造方法传进去。
创建P的方法
@Override public P createPresenter() { try { return mPresentClass.newInstance(); } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); throw new RuntimeException("Presenter创建失败,检查注解声明"); } }当你Class对象传进来以后,并且被维护成成员变量mPresentClass了,这个时候你就可以通过newInstance()来创建这个对象的实例了。
上面的流程就是通过注解+反射的机制获取了类名,再通过newInstance来创建了对象。
因为我们还要考虑mvp在fragment上的使用和我们不仅仅满足于createPresente