spring-LocalVariableTableParameterNameDiscoverer

记录一下后期整理

注:此工具类是解析class文件从class文件获取,而不是通过元空间的class对象的method获取

 

/**
         * 在 jdk 8 以前java源码编译后通过反射是无法获得形参名的,在Java 8及之后,编译的时候可以通过-parameters 为反射生成元信息,可以获取到方法的参数名,但这个行为默认是关闭的,
         * 我们平常用Spring的时候也没有开启, 那在没有开启和jdk 8 以前那在Springmvc项目中是如何获得方法的形参的呢,这个形参可关系到根据参数名称依赖注入和Controller中参数绑定。
         * 答案是 通过字节码技术,将该类的class文件读进来,通过class的存储信息来得到的 ,就是LocalVariableTableParameterNameDiscoverer的inspectClass方法得到形参名
         */
        private LocalVariableTableParameterNameDiscoverer localVariableTableParameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();

        /**
         * 预置方法参数为el 内置变量
         *
         * @param invocation
         * @param ctx
         */
        private void setCtxVariableByMethodParameter(MethodInvocation invocation, EvaluationContext ctx) {
            Method method = invocation.getMethod();
            Parameter[] parameters = method.getParameters();
            if (ArrayUtil.isEmpty(parameters)) {
                return;
            }
            // 内部有缓存
            String[] names = localVariableTableParameterNameDiscoverer.getParameterNames(method);
            Object[] arguments = invocation.getArguments();
            for (int i = 0; i < names.length; i++) {
                if (log.isDebugEnabled()) {
                    log.debug("#111  ctx.setVariable name={},value={}", names[i], arguments[i]);
                }
                ctx.setVariable(names[i], arguments[i]);
            }
        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章