記錄一下後期整理
注:此工具類是解析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]); } }