博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javassist获得方法参数名称
阅读量:7178 次
发布时间:2019-06-29

本文共 2446 字,大约阅读时间需要 8 分钟。

hot3.png

举例,方法get(String name, long id),目的想获得name,id这两个名称:

初衷:做日志拦截的时候,比如拦截了方法get(String name, long id),想在日志表中记录成姓名:admin,主键:123,

就需要获取方法的参数名称,以便将参数名称翻译成对应的中文名,比如name对应姓名,id对应主键

package cn.sniper.reflect.utils;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;import javassist.ClassClassPath;import javassist.ClassPool;import javassist.CtClass;import javassist.CtMethod;import javassist.Modifier;import javassist.NotFoundException;import javassist.bytecode.CodeAttribute;import javassist.bytecode.LocalVariableAttribute;import javassist.bytecode.MethodInfo;import com.audaque.webkit.web.action.IndexAction;public class ReflectUtil {  private static final Map
> PARAM_MAP = new HashMap
>();  private static final ReadWriteLock RWL = new ReentrantReadWriteLock();  private static final ClassPool CLASS_POOL = ClassPool.getDefault();    static {  //解决javassist.NotFoundException报错  CLASS_POOL.insertClassPath(new ClassClassPath(IndexAction.class)); } /**  * 拿到方法的参数名称  * 比如get(long id, String name)  * 获得id, name  */ public static List
 getParamNameList(Class clazz, String methodName) {  RWL.readLock().lock();  List
 paramNameList = PARAM_MAP.get(clazz.getName()+"-"+methodName);  try {   if(paramNameList == null || paramNameList.size() <= 0) {    try {     RWL.readLock().unlock();     RWL.writeLock().lock();     if(paramNameList == null || paramNameList.size() <= 0) {      try {         paramNameList = new ArrayList
();          CtClass cc = CLASS_POOL.get(clazz.getName());            CtMethod cm = cc.getDeclaredMethod(methodName);                   // 使用javaassist的反射方法获取方法的参数名            MethodInfo methodInfo = cm.getMethodInfo();            CodeAttribute codeAttribute = methodInfo.getCodeAttribute();            LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);            if (attr != null) {             int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;             for (int i = 0; i < cm.getParameterTypes().length; i++) {               paramNameList.add(attr.variableName(i + pos));           }          }        } catch (NotFoundException e) {            e.printStackTrace();        }              PARAM_MAP.put(clazz.getName()+"-"+methodName, paramNameList);     }    } finally {     RWL.writeLock().unlock();     RWL.readLock().lock();    }   }     } finally {   RWL.readLock().unlock();  }    return paramNameList; } }

转载于:https://my.oschina.net/sniperLi/blog/492401

你可能感兴趣的文章
linux下export命令添加、删除环境变量(转载)
查看>>
ListView优化
查看>>
【Java例题】5.3 线性表的使用
查看>>
http中的post与get
查看>>
在C++中,setw(int n)
查看>>
关于Javascript改变readonly的服务端控件的值
查看>>
JavaScript系列问题
查看>>
区块链
查看>>
java 连接数据库mysql的方法
查看>>
使用@ResponseBody返回JSON数据
查看>>
java_对象序列化、反序列化
查看>>
例说学习方法的改造和提升
查看>>
将XmlDocument转化String,将String转化为 XmlDocument
查看>>
Java 字节码
查看>>
字符串匹配算法-KMP
查看>>
Spring事务管理
查看>>
CCF NOI2019获奖规则
查看>>
安装.NET Core遇到的错误
查看>>
asp.net页面事件执行顺序(转)
查看>>
vue2.X 自定义 侧滑菜单 组件
查看>>