0
Mybatis可以用反射設置值? 我有一個類,它有一個屬性,它的setter被保護。所以我必須使用反射來設置這個值? Mybatis可以工作嗎?Mybatis可以用反射設置值?
Mybatis可以用反射設置值? 我有一個類,它有一個屬性,它的setter被保護。所以我必須使用反射來設置這個值? Mybatis可以工作嗎?Mybatis可以用反射設置值?
是的,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
謝謝你,心動不如行動! – Today