// Path: app/src/main/java/com/team/zhuoke/masterhelper/base/BaseModel.java
// public interface BaseModel {
// 
// }
// 
// Path: app/src/main/java/com/team/zhuoke/masterhelper/base/BasePresenter.java
// public abstract   class BasePresenter<V extends  BaseView, M extends  BaseModel> implements Presenter<V,M> {
// 
// 
//    protected Context mContext;
// 
//     protected V mView;
// 
//     protected M mModel;
// 
//     protected CompositeSubscription mCompositeSubscription;
// 
//     protected void unSubscribe() {
//         if (mCompositeSubscription != null) {
//             mCompositeSubscription.unsubscribe();
//         }
//     }
//     protected void addSubscribe(Subscription subscription) {
//         if (mCompositeSubscription == null) {
//             mCompositeSubscription = new CompositeSubscription();
//         }
//         mCompositeSubscription.add(subscription);
//     }
// 
// //    获取绑定View实例
//     @Override
//     public void attachView(V view) {
//           this.mView=view;
//     }
// //    获取绑定Model层实例
//     @Override
//     public void attachModel(M m) {
//         this.mModel=m;
//     }
// 
// 
//     public M getModel() {
//         return mModel;
//     }
//     //    注销mModel实例
//     @Override
//     public void detachModel() {
//         this.mModel=null;
//     }
// 
//     //    注销View实例
//     @Override
//     public void detachView() {
//          this.mView=null;
//         unSubscribe();
//     }
// 
//     public V getView() {
//         return mView;
//     }
// 
//     public boolean isViewBind()
//     {
//         return mView!=null;
//     }
// 
// }
// 
// Path: app/src/main/java/com/team/zhuoke/masterhelper/base/BaseView.java
// public interface BaseView<P> {
// 
// }


import com.team.zhuoke.masterhelper.base.BaseModel;
import com.team.zhuoke.masterhelper.base.BasePresenter;
import com.team.zhuoke.masterhelper.base.BaseView;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
package com.team.zhuoke.masterhelper.model;




public class ContractProxy {
    private static final ContractProxy m_instance = new ContractProxy();

    public static ContractProxy getInstance() {
        return m_instance;
    }

    private ContractProxy() {
        m_objects = new HashMap<>();
    }

    private Map<Class, Object> m_objects;

//    /**
//     * 进行初始化
//     *
//     * @param clss
//     */
//    public void init(Class... clss) {
//        for (Class cls : clss) {
//            if (cls.isAnnotationPresent(Implement.class)) {
////                list.add(cls);
//                for (Annotation ann : cls.getDeclaredAnnotations()) {
//                    if (ann instanceof Implement) {
//                        try {
//                            m_objects.put(cls, ((Implement) ann).value().newInstance());
//                        } catch (InstantiationException e) {
//                            e.printStackTrace();
//                        } catch (IllegalAccessException e) {
//                            e.printStackTrace();
//                        }
//                    }
//                }
//            }
//        }
//    }

    /**
     *   Presenter
     * 通过反射, 获得定义Class时声明的父类的泛型参数的类型.
     *
     *@param clazz
     *            clazz The class to introspect
     * @param index
     *            the Index of the generic ddeclaration,start from 0.
     * @return the index generic declaration, or Object.class if cannot be
     *         determined
     */
    @SuppressWarnings("unchecked")
        public static Class<BasePresenter> getPresnterClazz(final Class clazz, final int index) {

        //返回表示此 Class 所表示的实体（类、接口、基本类型或 void）的直接超类的 Type。
        Type genType = clazz.getGenericSuperclass();

        if (!(genType instanceof ParameterizedType)) {
            return BasePresenter.class;
        }
        //返回表示此类型实际类型参数的 Type 对象的数组。
        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();

        if (index >= params.length || index < 0) {
            return BasePresenter.class;
        }
        if (!(params[index] instanceof Class)) {
            return BasePresenter.class;
        }
        return (Class) params[index];
    }
    /**
     *  Model
     * 通过反射, 获得定义Class时声明的父类的泛型参数的类型.
     *
     *@param clazz
     *            clazz The class to introspect
     * @param index
     *            the Index of the generic ddeclaration,start from 0.
     * @return the index generic declaration, or Object.class if cannot be
     *         determined
     */
    @SuppressWarnings("unchecked")
// Path: app/src/main/java/com/team/zhuoke/masterhelper/base/BaseModel.java
// public interface BaseModel {
// 
// }
// 
// Path: app/src/main/java/com/team/zhuoke/masterhelper/base/BasePresenter.java
// public abstract   class BasePresenter<V extends  BaseView, M extends  BaseModel> implements Presenter<V,M> {
// 
// 
//    protected Context mContext;
// 
//     protected V mView;
// 
//     protected M mModel;
// 
//     protected CompositeSubscription mCompositeSubscription;
// 
//     protected void unSubscribe() {
//         if (mCompositeSubscription != null) {
//             mCompositeSubscription.unsubscribe();
//         }
//     }
//     protected void addSubscribe(Subscription subscription) {
//         if (mCompositeSubscription == null) {
//             mCompositeSubscription = new CompositeSubscription();
//         }
//         mCompositeSubscription.add(subscription);
//     }
// 
// //    获取绑定View实例
//     @Override
//     public void attachView(V view) {
//           this.mView=view;
//     }
// //    获取绑定Model层实例
//     @Override
//     public void attachModel(M m) {
//         this.mModel=m;
//     }
// 
// 
//     public M getModel() {
//         return mModel;
//     }
//     //    注销mModel实例
//     @Override
//     public void detachModel() {
//         this.mModel=null;
//     }
// 
//     //    注销View实例
//     @Override
//     public void detachView() {
//          this.mView=null;
//         unSubscribe();
//     }
// 
//     public V getView() {
//         return mView;
//     }
// 
//     public boolean isViewBind()
//     {
//         return mView!=null;
//     }
// 
// }
// 
// Path: app/src/main/java/com/team/zhuoke/masterhelper/base/BaseView.java
// public interface BaseView<P> {
// 
// }


// Path: app/src/main/java/com/team/zhuoke/masterhelper/model/ContractProxy.java
import com.team.zhuoke.masterhelper.base.BaseModel;
import com.team.zhuoke.masterhelper.base.BasePresenter;
import com.team.zhuoke.masterhelper.base.BaseView;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

package com.team.zhuoke.masterhelper.model;




public class ContractProxy {
    private static final ContractProxy m_instance = new ContractProxy();

    public static ContractProxy getInstance() {
        return m_instance;
    }

    private ContractProxy() {
        m_objects = new HashMap<>();
    }

    private Map<Class, Object> m_objects;

//    /**
//     * 进行初始化
//     *
//     * @param clss
//     */
//    public void init(Class... clss) {
//        for (Class cls : clss) {
//            if (cls.isAnnotationPresent(Implement.class)) {
////                list.add(cls);
//                for (Annotation ann : cls.getDeclaredAnnotations()) {
//                    if (ann instanceof Implement) {
//                        try {
//                            m_objects.put(cls, ((Implement) ann).value().newInstance());
//                        } catch (InstantiationException e) {
//                            e.printStackTrace();
//                        } catch (IllegalAccessException e) {
//                            e.printStackTrace();
//                        }
//                    }
//                }
//            }
//        }
//    }

    /**
     *   Presenter
     * 通过反射, 获得定义Class时声明的父类的泛型参数的类型.
     *
     *@param clazz
     *            clazz The class to introspect
     * @param index
     *            the Index of the generic ddeclaration,start from 0.
     * @return the index generic declaration, or Object.class if cannot be
     *         determined
     */
    @SuppressWarnings("unchecked")
        public static Class<BasePresenter> getPresnterClazz(final Class clazz, final int index) {

        //返回表示此 Class 所表示的实体（类、接口、基本类型或 void）的直接超类的 Type。
        Type genType = clazz.getGenericSuperclass();

        if (!(genType instanceof ParameterizedType)) {
            return BasePresenter.class;
        }
        //返回表示此类型实际类型参数的 Type 对象的数组。
        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();

        if (index >= params.length || index < 0) {
            return BasePresenter.class;
        }
        if (!(params[index] instanceof Class)) {
            return BasePresenter.class;
        }
        return (Class) params[index];
    }
    /**
     *  Model
     * 通过反射, 获得定义Class时声明的父类的泛型参数的类型.
     *
     *@param clazz
     *            clazz The class to introspect
     * @param index
     *            the Index of the generic ddeclaration,start from 0.
     * @return the index generic declaration, or Object.class if cannot be
     *         determined
     */
    @SuppressWarnings("unchecked")
    public static Class<BaseModel> getModelClazz(final Class clazz, final int index) {