javassist:加強型的java反射工具,獲取方法參數名

java的反射是不能獲取方法的參數名的。好比:java

[java] view plaincopyprint?spa

  1. public String concatString(String str1,String str2){  .net

  2.     return str1+str2;  code

  3. }  blog

    public String concatString(String str1,String str2){
        return str1+str2;
    }

想獲取"str1",和"str1"這個參數名,使用JDK自帶的反射是不行的。可是咱們藉助第三方包 javaassist 就能夠得到。

[java] view plaincopyprint?get

  1. public static void main(String[] args) {  it

  2.     Class clazz = TestJavaAssist.class;  io

  3.     try {  class

  4.         ClassPool pool = ClassPool.getDefault();  exception

  5.         CtClass cc = pool.get(clazz.getName());  

  6.         CtMethod cm = cc.getDeclaredMethod("concatString");  

  7.   

  8.         // 使用javaassist的反射方法獲取方法的參數名  

  9.         MethodInfo methodInfo = cm.getMethodInfo();  

  10.         CodeAttribute codeAttribute = methodInfo.getCodeAttribute();  

  11.         LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);  

  12.         if (attr == null) {  

  13.             // exception  

  14.         }  

  15.         String[] paramNames = new String[cm.getParameterTypes().length];  

  16.         int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;  

  17.         for (int i = 0; i < paramNames.length; i++)  

  18.             paramNames[i] = attr.variableName(i + pos);  

  19.         // paramNames即參數名  

  20.         for (int i = 0; i < paramNames.length; i++) {  

  21.             System.out.println(paramNames[i]);  

  22.         }  

  23.   

  24.     } catch (NotFoundException e) {  

  25.         e.printStackTrace();  

  26.     }  

  27. }  

public static void main(String[] args) {
		Class clazz = TestJavaAssist.class;
		try {
			ClassPool pool = ClassPool.getDefault();
			CtClass cc = pool.get(clazz.getName());
			CtMethod cm = cc.getDeclaredMethod("concatString");

			// 使用javaassist的反射方法獲取方法的參數名
			MethodInfo methodInfo = cm.getMethodInfo();
			CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
			LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
			if (attr == null) {
				// exception
			}
			String[] paramNames = new String[cm.getParameterTypes().length];
			int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;
			for (int i = 0; i < paramNames.length; i++)
				paramNames[i] = attr.variableName(i + pos);
			// paramNames即參數名
			for (int i = 0; i < paramNames.length; i++) {
				System.out.println(paramNames[i]);
			}

		} catch (NotFoundException e) {
			e.printStackTrace();
		}
	}
相關文章
相關標籤/搜索