我是靠谱客的博主 害羞音响,最近开发中收集的这篇文章主要介绍javassist:增强型的java反射工具,获取方法参数名,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

[java] view plaincopyprint?

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

  2.     return str1+str2;  

  3. }  

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

想获取"str1",和"str1"这个参数名,使用JDK自带的反射是不行的。但是我们借助第三方包 javaassist 就可以获得。

[java] view plaincopyprint?

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

  2.     Class clazz = TestJavaAssist.class;  

  3.     try {  

  4.         ClassPool pool = ClassPool.getDefault();  

  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();
}
}

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

最后

以上就是害羞音响为你收集整理的javassist:增强型的java反射工具,获取方法参数名的全部内容,希望文章能够帮你解决javassist:增强型的java反射工具,获取方法参数名所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(75)

评论列表共有 0 条评论

立即
投稿
返回
顶部