javassist:增强型的java反射工具,获取方法参数名

java的反射是不能获取方法的参数名的。比如:

public String concatString(String  param1,String  param2){
         return param1+param2;
    }

 


想获取"param1",和"param2"这个参数名,貌似是不行的。借助第三方包javaassist就可以获得。

 

整合原作者代码:

 

 

Java代码   收藏代码
  1. import javassist.ClassPool;  
  2. import javassist.CtClass;  
  3. import javassist.CtMethod;  
  4. import javassist.Modifier;  
  5. import javassist.NotFoundException;  
  6. import javassist.bytecode.CodeAttribute;  
  7. import javassist.bytecode.LocalVariableAttribute;  
  8. import javassist.bytecode.MethodInfo;  
  9.   
  10. public class Test {  
  11.     public static void main(String[] args) {  
  12.   
  13.         testReflectParamName();  
  14.           
  15.     }  
  16.   
  17.     /** 
  18.      * 反射获取方法参数名称 
  19.      */  
  20.     public static void testReflectParamName() {  
  21.         Class clazz = MyClass.class;  
  22.         try {  
  23.             ClassPool pool = ClassPool.getDefault();  
  24.             CtClass cc = pool.get(clazz.getName());  
  25.             CtMethod cm = cc.getDeclaredMethod("concatString");  
  26.   
  27.             // 使用javaassist的反射方法获取方法的参数名  
  28.             MethodInfo methodInfo = cm.getMethodInfo();  
  29.             CodeAttribute codeAttribute = methodInfo.getCodeAttribute();  
  30.             LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute  
  31.                     .getAttribute(LocalVariableAttribute.tag);  
  32.             if (attr == null) {  
  33.                 // exception  
  34.             }  
  35.             String[] paramNames = new String[cm.getParameterTypes().length];  
  36.             int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;  
  37.             for (int i = 0; i < paramNames.length; i++)  
  38.                 paramNames[i] = attr.variableName(i + pos);  
  39.             // paramNames即参数名  
  40.             for (int i = 0; i < paramNames.length; i++) {  
  41.                 System.out.println("参数名" + i + ":" + paramNames[i]);  
  42.             }  
  43.   
  44.         } catch (NotFoundException e) {  
  45.             e.printStackTrace();  
  46.         }  
  47.     }  
  48. }  
  49.   
  50. class MyClass {  
  51.     public String concatString(String param1, String param2) {  
  52.         return param1 + param2;  
  53.     }  
  54. }  

 

 

反射获取参数注解:

 

 

Java代码   收藏代码
  1. import java.lang.annotation.Annotation;  
  2. import java.lang.annotation.ElementType;  
  3. import java.lang.annotation.Retention;  
  4. import java.lang.annotation.RetentionPolicy;  
  5. import java.lang.annotation.Target;  
  6. import java.lang.reflect.Method;  
  7. import java.util.Date;  
  8.   
  9. import javassist.ClassPool;  
  10. import javassist.CtClass;  
  11. import javassist.CtMethod;  
  12. import javassist.Modifier;  
  13. import javassist.NotFoundException;  
  14. import javassist.bytecode.CodeAttribute;  
  15. import javassist.bytecode.LocalVariableAttribute;  
  16. import javassist.bytecode.MethodInfo;  
  17.   
  18. public class Test {  
  19.     public static void main(String[] args) {  
  20.   
  21.         testReflectParamName();  
  22.         // 反射获取方法参数注解  
  23.         testReflectMethodParamAnno();  
  24.     }  
  25.   
  26.     /** 
  27.      * 反射获取方法参数名称 
  28.      */  
  29.     public static void testReflectParamName() {  
  30.         Class clazz = MyClass.class;  
  31.         try {  
  32.             ClassPool pool = ClassPool.getDefault();  
  33.             CtClass cc = pool.get(clazz.getName());  
  34.             CtMethod cm = cc.getDeclaredMethod("concatString");  
  35.   
  36.             // 使用javaassist的反射方法获取方法的参数名  
  37.             MethodInfo methodInfo = cm.getMethodInfo();  
  38.             CodeAttribute codeAttribute = methodInfo.getCodeAttribute();  
  39.             LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute  
  40.                     .getAttribute(LocalVariableAttribute.tag);  
  41.             if (attr == null) {  
  42.                 // exception  
  43.             }  
  44.             String[] paramNames = new String[cm.getParameterTypes().length];  
  45.             int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;  
  46.             for (int i = 0; i < paramNames.length; i++)  
  47.                 paramNames[i] = attr.variableName(i + pos);  
  48.             // paramNames即参数名  
  49.             for (int i = 0; i < paramNames.length; i++) {  
  50.                 System.out.println("参数名" + i + ":" + paramNames[i]);  
  51.             }  
  52.   
  53.         } catch (NotFoundException e) {  
  54.             e.printStackTrace();  
  55.         }  
  56.     }  
  57.   
  58.     /** 
  59.      * 反射获取方法参数注解 
  60.      */  
  61.     public static void testReflectMethodParamAnno() {  
  62.         Class clazz = MyClass.class;  
  63.         try {  
  64.             // 使用jdk原生的反射方法  
  65.             Method m = clazz.getDeclaredMethod("datefomat",  
  66.                     new Class[] { Date.class });  
  67.             Annotation[][] annotations = m.getParameterAnnotations();  
  68.             System.out.println("jdk获取方法参数anno:"+annotations[0][0]);  
  69.         } catch (SecurityException e) {  
  70.             e.printStackTrace();  
  71.         } catch (NoSuchMethodException e) {  
  72.             e.printStackTrace();  
  73.         }  
  74.   
  75.         try {  
  76.             ClassPool pool = ClassPool.getDefault();  
  77.             CtClass cc = pool.get(clazz.getName());  
  78.             CtMethod cm = cc.getDeclaredMethod("datefomat");  
  79.   
  80.             // 使用javassist的反射方法可以获得参数标注值  
  81.             Object[][] annotations = cm.getParameterAnnotations();  
  82.             DateFormat myAnno = (DateFormat) annotations[0][0];  
  83.             System.out.println("参数注解:"+myAnno.value());  
  84.   
  85.         } catch (NotFoundException e) {  
  86.             e.printStackTrace();  
  87.         } catch (ClassNotFoundException e) {  
  88.             e.printStackTrace();  
  89.         }  
  90.     }  
  91. }  
  92.   
  93. class MyClass {  
  94.     public String concatString(String param1, String param2) {  
  95.         return param1 + param2;  
  96.     }  
  97.   
  98.     public String datefomat(@DateFormat("yyyy-MM-dd HH")  
  99.     Date date1) {  
  100.         return date1.toString();  
  101.     }  
  102. }  
  103.   
  104. // 注解类  
  105. @Target(ElementType.PARAMETER)  
  106. @Retention(RetentionPolicy.RUNTIME)  
  107. @interface DateFormat {  
  108.     String value() default "yyyy-MM-dd";  
  109. }  

 

你可能感兴趣的:(java,反射,参数名)