package com.alibaba.tamper.core.introspect; import java.lang.ref.SoftReference; import java.lang.reflect.Method; import com.alibaba.tamper.core.BeanMappingException; /** * 暴露给外部的内审接口操作,外部可通过Uberspector.getInstance()进行操作 * * @author jianghang 2011-5-25 下午01:18:18 */ public class UberspectImpl implements Uberspect { private SoftReference<Introspector> introspector; public UberspectImpl(){ introspector = new SoftReference(new Introspector()); } public UberspectImpl(Introspector introspector){ // 允许自定义传入introspector this.introspector = new SoftReference(introspector); } public BatchExecutor getBatchExecutor(Class locatorClass, String[] identifier, Class[] args) { final Class<?> clazz = locatorClass; // 尝试一下map处理 MapBatchExecutor mBatchExecutor = new MapBatchExecutor(getIntrospector(), clazz, identifier); if (mBatchExecutor.isAlive()) { return mBatchExecutor; } // 尝试一下bean处理 if (identifier != null) { PropertyBatchExecutor pBatchExecutor = new PropertyBatchExecutor(getIntrospector(), clazz, identifier, args); if (pBatchExecutor.isAlive()) { return pBatchExecutor; } } // 如果没有匹配到executor,则返回null,不做batch优化 return null; } public GetExecutor getGetExecutor(Class locatorClass, Object identifier) { final Class<?> clazz = locatorClass; final String property = (identifier == null ? null : identifier.toString()); // 尝试一下bean处理 if (property != null) { PropertyGetExecutor pExecutor = new PropertyGetExecutor(getIntrospector(), clazz, property); if (pExecutor.isAlive()) { return pExecutor; } } // 尝试一下特殊符号,比如"null" NullSymbolGetExecutor nExecutor = new NullSymbolGetExecutor(getIntrospector(), clazz, property); if (nExecutor.isAlive()) { return nExecutor; } // 尝试一下特殊符号,比如"this" ThisSymbolGetExecutor sExecutor = new ThisSymbolGetExecutor(getIntrospector(), clazz, property); if (sExecutor.isAlive()) { return sExecutor; } // 尝试一下map处理 MapGetExecutor mExecutor = new MapGetExecutor(getIntrospector(), clazz, property); if (mExecutor.isAlive()) { return mExecutor; } // 尝试一下直接field操作 FieldGetExecutor fExecutor = new FieldGetExecutor(getIntrospector(), clazz, property); if (fExecutor.isAlive()) { return fExecutor; } throw new BeanMappingException("can not found GetExecutor for Class[" + clazz.getName() + "] , identifier[" + identifier + "]"); } public SetExecutor getSetExecutor(Class locatorClass, Object identifier, Class arg) { final Class<?> clazz = locatorClass; final String property = (identifier == null ? null : identifier.toString()); // 尝试一下bean处理 if (property != null) { PropertySetExecutor pExecutor = new PropertySetExecutor(getIntrospector(), clazz, property, arg); if (pExecutor.isAlive()) { return pExecutor; } } // 尝试一下map处理 MapSetExecutor mExecutor = new MapSetExecutor(getIntrospector(), clazz, property, arg); if (mExecutor.isAlive()) { return mExecutor; } // 尝试一下直接field操作 FieldSetExecutor fExecutor = new FieldSetExecutor(getIntrospector(), clazz, property, arg); if (fExecutor.isAlive()) { return fExecutor; } throw new BeanMappingException("can not found SetExecutor for Class[" + clazz.getName() + "] , identifier[" + identifier + "]"); } /** * 根据executor返回对应的参数类型 */ public Class getGetClass(GetExecutor getExecutor, Class srcRefClass, Class getResultClass) { // 设置为自动提取的targetClasss if (getExecutor instanceof MapGetExecutor) { if (getResultClass != null) { return getResultClass;// 优先设置为getResult的class对象 } } else if (getExecutor instanceof FastPropertyGetExecutor) { return ((FastPropertyGetExecutor) getExecutor).getMethod().getReturnType(); // 获取getExecutor方法的返回结果类型 } else if (getExecutor instanceof PropertyGetExecutor) { return ((PropertyGetExecutor) getExecutor).getMethod().getReturnType(); // 获取getExecutor方法的返回结果类型 } else if (getExecutor instanceof FieldGetExecutor) { return ((FieldGetExecutor) getExecutor).getField().getType(); // 获取属性的类型 } else if (getExecutor instanceof ThisSymbolGetExecutor) { return srcRefClass; // 返回对应src的类型 } return null; // throw new BeanMappingException("unknow GetExecutor"); } /** * 根据executor返回对应的参数类型 */ public Class getSetClass(SetExecutor setExecutor, Class srcRefClass, Class getResultClass) { if (setExecutor instanceof MapSetExecutor) { if (getResultClass != null) { return getResultClass;// 优先设置为getResult的class对象 } } else if (setExecutor instanceof FastPropertySetExecutor) { return getTargetClass(((FastPropertySetExecutor) setExecutor).getMethod().getJavaMethod()); } else if (setExecutor instanceof PropertySetExecutor) { return getTargetClass(((PropertySetExecutor) setExecutor).getMethod()); } else if (setExecutor instanceof FieldSetExecutor) { return ((FieldSetExecutor) setExecutor).getField().getType(); } return null; // throw new BeanMappingException("unknow SetExecutor"); } /** * 根据{@linkplain SetExecutor}获取对应的目标targetClass */ private Class getTargetClass(Method setMethod) { Class[] params = setMethod.getParameterTypes(); if (params == null || params.length != 1) { throw new BeanMappingException("illegal set method[" + setMethod.getName() + "] for ParameterType"); } return params[0]; } // ================= setter / getter ================= public Introspector getIntrospector() { Introspector in = introspector.get(); if (in == null) { introspector = new SoftReference<Introspector>(new Introspector());// 重新创建一个 return getIntrospector(); } else { return in; } } public void setIntrospector(Introspector introspector) { this.introspector = new SoftReference<Introspector>(introspector); } }