博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javassist:增强型的java反射工具,获取方法参数名
阅读量:5884 次
发布时间:2019-06-19

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

hot3.png

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

[java]

  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自带的反射是不行的。但是我们借助第三方包
就可以获得。

[java]

  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

你可能感兴趣的文章
VB用windows API激活子窗体
查看>>
集成hibernateDaoSupport实现增删改查
查看>>
MyBatis入门学习教程-解决字段名与实体类属性名不相同的冲突
查看>>
一个优秀的C#开源绘图软件 DrawTools
查看>>
Mac OS 使用 Vagrant 管理虚拟机(VirtualBox)
查看>>
芝麻信用商家接入指南
查看>>
通过维基API实现维基百科查询功能
查看>>
bootstrap 2
查看>>
Annotation研究的一些学习资料
查看>>
webpack资料
查看>>
DotNet加密方式解析--散列加密
查看>>
OpenSSL使用2(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12概念说明)(转)
查看>>
win 下 apache 虚拟主机配置方式
查看>>
第十一篇:基于TCP的一对回射客户/服务器程序及其运行过程分析( 下 )
查看>>
【HDU1219】AC Me(水题)
查看>>
【前端】:HTML
查看>>
从JDBC程序看为什么需要Mybatis
查看>>
ZOJ 1403&&HDU 1015 Safecracker【暴力】
查看>>
Oracle树查询及相关函数
查看>>
更新软件
查看>>