2016-03-15 72 views
0

Mybatis可以用反射設置值? 我有一個類,它有一個屬性,它的setter被保護。所以我必須使用反射來設置這個值? Mybatis可以工作嗎?Mybatis可以用反射設置值?

回答

2

是的,mybatis的使用反映了設定值。 Reflator.java(mybatis 3.3.0)中的 ,mybatis將配置set方法。

private void addSetMethods(Class<?> cls) { 
    Map<String, List<Method>> conflictingSetters = new HashMap<String, List<Method>>(); 
    Method[] methods = getClassMethods(cls); 
    for (Method method : methods) { 
     String name = method.getName(); 
     if (name.startsWith("set") && name.length() > 3) { 
     if (method.getParameterTypes().length == 1) { 
      name = PropertyNamer.methodToProperty(name); 
      addMethodConflict(conflictingSetters, name, method); 
     } 
     } 
    } 
    resolveSetterConflicts(conflictingSetters); 
    } 

如果你的類不具備設置方法,當addSetFields這將增加對領域的新SetInvoker:

private void addSetField(Field field) { 
    if (isValidPropertyName(field.getName())) { 
     setMethods.put(field.getName(), new SetFieldInvoker(field)); 
     setTypes.put(field.getName(), field.getType()); 
    } 
    } 

和SetFieldInvoker是這樣的:

/** 
* @author Clinton Begin 
*/ 
public class SetFieldInvoker implements Invoker { 
    private Field field; 

    public SetFieldInvoker(Field field) { 
    this.field = field; 
    } 

    @Override 
    public Object invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTargetException { 
    field.set(target, args[0]); 
    return null; 
    } 

    @Override 
    public Class<?> getType() { 
    return field.getType(); 
    } 
} 

的DefaultResultSetHandler調用BeanWrapper的setBeanProperty方法將調用getSetInvoker

private void setBeanProperty(PropertyTokenizer prop, Object object, Object value) { 
    try { 
     Invoker method = metaClass.getSetInvoker(prop.getName()); 
     Object[] params = {value}; 
     try { 
     method.invoke(object, params); 
     } catch (Throwable t) { 
     throw ExceptionUtil.unwrapThrowable(t); 
     } 
    } catch (Throwable t) { 
     throw new ReflectionException("Could not set property '" + prop.getName() + "' of '" + object.getClass() + "' with value '" + value + "' Cause: " + t.toString(), t); 
    } 
    } 

整個調用鏈也許是這樣的: DefaultSqlSession ##的SelectList - > SimpleExecutor ## doQuery - > SimpleStatementHandler ##查詢 - > DefaultResultSetHandler ## handleResultSets

+0

謝謝你,心動不如行動! – Today