SqlNode sqlNode = (SqlNode) field.get(sqlSource);
Object argParameter = args[1];
// 获取传递给 mapper 的参数对象
if (!sourceStorage.contains(sqlSource.hashCode()) && argParameter != null) {
if (argParameter instanceof HashMap) {
// 处理 map 类型的参数
Map<String, Object> argMap = (Map<String, Object>) argParameter;
// 判断是否传递 schemaName或schema 如果已经传递则使用用户传递的值 否则使用默认值
String schemaNameStr = "schemaName", schemaStr = "schema";
if (StringUtils.isEmpty(MapUtils.getString(argMap, schemaNameStr)) && StringUtils.isEmpty(MapUtils.getString(argMap, schemaStr))) {
SqlNode proxyNode = proxyNode(sqlNode);
field.set(sqlSource, proxyNode);
}
} else {
// 处理封装成请求对象类型的参数
Class<?> clz = argParameter.getClass();
// 获取实体类的所有属性
Field[] fields = clz.getDeclaredFields();
for (Field f : fields) {
String fieldName = f.getName();
Class<?> fieldType = f.getType();
// 处理 schemaName 属性
if (SCHEMA.equals(fieldName)) {
// 获取 schemaName 属性的 getter 方法
String methodName = getMethodName(fieldName);
String getName = "get" + methodName;
Method getFieldValue = clz.getMethod(getName);
String val = (String) getFieldValue.invoke(argParameter);
// schemaName 属性值为空则使用默认值
if (StringUtils.isBlank(val)) {
String setName = "set" + methodName;
Method setFieldValue = clz.getMethod(setName, fieldType);
setFieldValue.invoke(argParameter, schema);
}
}
}
}
sourceStorage.add(sqlSource.hashCode());
}
}
return invocation.proceed();
}
/\*\*
* 通过动态代理对象 添加schema参数
*
* @param sqlNode SQL节点
* @return SqlNode
*/
private SqlNode proxyNode(SqlNode sqlNode) {
return (SqlNode) Proxy.newProxyInstance(sqlNode.getClass().getClassLoader(),
new Class[]{SqlNode.class}, new SqlNodeInvocationHandler(sqlNode));
}
private class SqlNodeInvocationHandler implements InvocationHandler {
private SqlNode target;
SqlNodeInvocationHandler(SqlNode target) {
super();
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
DynamicContext context = (DynamicContext) args[0];
setSchema(schema);
context.getBindings().put(SCHEMA, schema);
return method.invoke(target, args);
}
}
/\*\*
* 给schema 添加.
*
* @param schema schemaName
*/
private void setSchema(String schema) {
String pointStr = “.”;
if (StringUtils.isNotBlank(schema)) {
if (!schema.endsWith(pointStr)) {
schema += pointStr;
}
}
this.schema = schema;
}
/\*\*
* 将首字母变成大写
*
* @param fieldName 字段名称
* @return 首字母大写的字段名称
*/
private static String getMethodName(String fieldName) {
byte[] items = fieldName.getBytes();
items[0] = (byte) ((char) items[0] - ‘a’ + ‘A’);
return new String(items);
}
### 方法解析
拦截到的参数对象是 Object 类型,可以通过方法名获取其 getter 和 setter 方法,使用获取到的方法执行即可获取或设置指定的属性值:
Object argParameter = args[1];
// 处理封装成请求对象类型的参数
Class<?> clz = argParameter.getClass();
// 获取实体类的所有属性
Field[] fields = clz.getDeclaredFields();
for (Field f : fields) {
// 属性的名称
String fieldName = f.getName();
// 属性的类型
Class<?> fieldType = f.getType();
// 处理 schemaName 属性
if (SCHEMA.equals(fieldName)) {
// 获取 schemaName 属性的 getter 方法
String methodName = getMethodName(fieldName);
// 方法名
String getName = "get" + methodName;
// 获取到的 getter 方法
Method getFieldValue = clz.getMethod("get" + methodName);
// 执行 getter 方法
给大家的福利
零基础入门
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
同时每个成长路线对应的板块都有配套的视频提供:
因篇幅有限,仅展示部分资料
网络安全面试题
绿盟护网行动
还有大家最喜欢的黑客技术
网络安全源码合集+工具包
所有资料共282G,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~