【Java代码】反射机制处理传递给mapper文件的非Map类型参数对象(指定属性为空则设置默认值)_mapper层没有定义的参数默认

        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,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值