码迷,mamicode.com
首页 > 编程语言 > 详细

javassist获得方法参数名称

时间:2015-08-14 17:25:12      阅读:433      评论:0      收藏:0      [点我收藏+]

标签:

举例,方法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<String, List<String>> PARAM_MAP = new HashMap<String, List<String>>();
 
 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<String> getParamNameList(Class clazz, String methodName) {
  RWL.readLock().lock();
  List<String> 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<String>();
          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;
 }
 
}

javassist获得方法参数名称

标签:

原文地址:http://my.oschina.net/sniperLi/blog/492401

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!