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]);
            }
        }

 

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