package com.team.zhuoke.model;
import com.team.zhuoke.base.BaseModel;
import com.team.zhuoke.base.BasePresenter;
import com.team.zhuoke.base.BaseView;
import java.lang.annotation.Annotation;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
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;
//
// 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) {
//返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。
Type genType = clazz.getGenericSuperclass();
if (!(genType instanceof ParameterizedType)) {
return BaseModel.class;
}
//返回表示此类型实际类型参数的 Type 对象的数组。
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (index >= params.length || index < 0) {
return BaseModel.class;
}
if (!(params[index] instanceof Class)) {
return BaseModel.class;
}
return (Class) params[index];
}
/**
* 获取presenter
*
* @param clzz
* @param <T>
* @return
*/
public <T> T presenter(Class clzz) {
if (!m_objects.containsKey(clzz)) {
initInstance(clzz);
}
BasePresenter presenter = null;
try {
presenter = ((BasePresenter) clzz.newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return (T) presenter;
}
/**
* 进行初始化
*
* @param clss
*/
public void initInstance(Class clss) {
try {
m_objects.put(clss,clss.newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
/**
* 绑定 View
* @param presenter
* @param <V>
* @return
*/
public <V> V bindView(BaseView view,BasePresenter presenter) {
if (view != presenter.getView()) {
if (presenter.getView() != null) {
presenter.detachView();
}
presenter.attachView(view);
}
return (V) view;
}
/**
* 绑定Persenter
*
* @param clzz
* @param var1
* @param <T>
* @return
*/
public <T> T bindPresenter(Class clzz, BaseView var1) {
if (!m_objects.containsKey(clzz)) {
// init(clzz);
}
BasePresenter presenter = null;
try {
presenter = ((BasePresenter)clzz.newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
if (var1 != presenter.getView()) {
if (presenter.getView() != null) {
presenter.detachView();
}
presenter.attachView(var1);
}
return (T) presenter;
}
// 初始化model add map
public <M> M bindModel(Class clzz,BasePresenter presenter) {
if (!m_objects.containsKey(clzz)) {
initInstance(clzz);
}
BaseModel model = null;
try {
model = ((BaseModel) clzz.newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
if (model != presenter.getModel()) {
if (presenter.getModel() != null) {
presenter.detachModel();
}
presenter.attachModel(model);
}
return (M) model;
}
// 解除绑定 移除map
public void unbindPresenter(Class clzz, BaseView var1) {
if (m_objects.containsKey(clzz)) {
BasePresenter presenter = null;
try {
presenter = ((BasePresenter) clzz.newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
if (var1 != presenter.getView()) {
if (presenter.getView() != null)
presenter.detachView();
m_objects.remove(clzz);
}
}
}
// 解除绑定 移除map
public void unbindView(BaseView view, BasePresenter presenter) {
if (view != presenter.getView()) {
if (presenter.getView() != null)
presenter.detachView();
}
}
// 解除绑定 移除map
public void unbindModel(Class clzz, BasePresenter presenter) {
if (m_objects.containsKey(clzz)) {
BaseModel model = null;
try {
model = ((BaseModel) clzz.newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
if (model != presenter.getModel()) {
if (presenter.getModel() != null)
presenter.detachModel();
m_objects.remove(clzz);
}
}
}
}