java 如何动态获取接口方法参数名?反射肯定不行,asm\javassist已试

神的力量 2016-01-07 11:21:12
现有如下接口:

public interface PersonService {
public Integer insert(Person person);
public Integer updateByPrimaryKey(Person person);
public Integer deleteByPrimaryKey(Integer id);
public Person selectByPrimaryKey(Integer id);
}


现已定义一个方法(使用javassist实现):getParameterName,根据传入的类以及指定的方法名,获取方法的参数名字(不考虑重载情况)

private String[] getParameterName(Class clazz,String method){
try {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get(clazz.getName());
CtMethod cm = cc.getDeclaredMethod(method);
MethodInfo methodInfo = cm.getMethodInfo();
CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
if (attr != null) {
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);
return paramNames;
}

} catch (NotFoundException e) {
e.printStackTrace();
}
return null;
}

如我传入
getParameterName(String.class,"equalsIgnoreCase") ;
理应返回anotherString.

现在问题有俩:
1、获取不到JDK自带类的方法参数名
2、获取不到自己写的接口方法参数名

3、能获取到自己写的类的方法参数名(如2中接口实现类的参数名)


现在我就是有这样的业务需求,注意不是获取参数类型!获取参数型类通过反射一下就能拿到了,太简单。
求助各位出出主意,给给办法!
...全文
1946 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
oh_Maxy 2016-01-07
  • 打赏
  • 举报
回复
TypeVariable 的 getName() 方法,“返回此类型变量的名称,它出现在源代码中。”看看是否符合要求
dracularking 2016-01-07
  • 打赏
  • 举报
回复
因为eclipse编译默认保留某些源码信息,理论上可行,试试这个开源工具,页面中有示例 https://github.com/paul-hammant/paranamer
oh_Maxy 2016-01-07
  • 打赏
  • 举报
回复
引用 4 楼 qq271859852 的回复:
[quote=引用 1 楼 oh_Maxy 的回复:] TypeVariable 的 getName() 方法,“返回此类型变量的名称,它出现在源代码中。”看看是否符合要求
我在网上貌似看过这个,但是试过无效,也不知道是不是自己使用的方法不对[/quote] 我也试了,好像是不行。。 貌似反射只关心参数类型,并不关心参数名。。
神的力量 2016-01-07
  • 打赏
  • 举报
回复
引用 7 楼 antiwise 的回复:
那我关注一下吧 也许是我太局限了 至于Eclipse代码提示那个是基于源码的,当然可以提示变量名,如果引用第三方的jar包里的 class就不会提示到变量名、参数名了;
我现在也想知道,如果有源码,又如何取到,就不要说将源码读进流里,然后用正则去取,那复杂的正则写起来会让人崩溃的。 学到了请告诉一声,麻烦了
OPPPPOP 2016-01-07
  • 打赏
  • 举报
回复
那我关注一下吧 也许是我太局限了 至于Eclipse代码提示那个是基于源码的,当然可以提示变量名,如果引用第三方的jar包里的 class就不会提示到变量名、参数名了;
神的力量 2016-01-07
  • 打赏
  • 举报
回复
引用 5 楼 antiwise 的回复:
你那个类没用过 但我经常会使用jad和jd-gui,编译出来的文件不管是变量、参数一概全是无意义的名称 什么localString0、localString1, xxxObject0等,其实细想一下也正常,毕竟变量名是给人编码用的,机器只需知道变量的地址和值即可,不需要变量名称
你说的对,机器读变量名没意义,但人读有意义,我后面也说了,这是业务需求。实际上也是可以做到的,因为eclipse就做到了 但eclipse的源码太多了,我也不知道从哪看起,也不知道看哪部分,否则倒是可以借鉴一下。
OPPPPOP 2016-01-07
  • 打赏
  • 举报
回复
你那个类没用过 但我经常会使用jad和jd-gui,编译出来的文件不管是变量、参数一概全是无意义的名称 什么localString0、localString1, xxxObject0等,其实细想一下也正常,毕竟变量名是给人编码用的,机器只需知道变量的地址和值即可,不需要变量名称
神的力量 2016-01-07
  • 打赏
  • 举报
回复
引用 1 楼 oh_Maxy 的回复:
TypeVariable 的 getName() 方法,“返回此类型变量的名称,它出现在源代码中。”看看是否符合要求
我在网上貌似看过这个,但是试过无效,也不知道是不是自己使用的方法不对
神的力量 2016-01-07
  • 打赏
  • 举报
回复
引用 2 楼 antiwise 的回复:
获取不到参数名的 class文件里不贮存这些信息的
这应该是不对的,我用ASM或者Javassist是可以获取自定义的类的参数名 况且,eclipse是纯java写的,如果获取不到这些信息,那eclipse 的 代码提示是如何做到呢?
OPPPPOP 2016-01-07
  • 打赏
  • 举报
回复
获取不到参数名的 class文件里不贮存这些信息的
Java Agent是Arthas使用的技术,是Skywalking使用的技术,是一份十分重要的技术。 课程的稀缺性在此之前,市面上并没有针对Java Agent进行系统介绍的课程。 通过搜索引擎查找,会发现与Java Agent相关的内容大多是个人知识总结分享的内容。这些内容有如下特点:内容质量不一详略程度不一学习难度千差万别总体上来说,学习者很难有一个整体认知、系统学习的过程。 课程的设计目标 在构思课程内容时,本课程带有以下目标:课程学习梯度:从简单到复杂,让学习者有一个循序渐进的理解过程。构造完整、统一的知识体系:不是零散的知识点堆砌,而是有一个统一的贯穿始终的知识框架。具有可操作性的代码示例,不只是讲概念,更注意于实践。课程内容安排 本课程通过四章内容对Java Agent相关知识进行讲解:第一章,介绍Agent Jar的三个组成部分:Manifest、Agent Class和ClassFileTransformer。第二章,介绍Agent Jar的两种启动方式:从命令行启动和使用Attach机制启动。第三章,介绍如何利用Instrumentation API来实现Agent Jar的功能。第四章,Java Agent的应用与技巧。 通过本课程的学习,让同学们更好地建立起一个完整的知识体系:  讲师介绍我叫刘森,南京师范大学研究生毕业,2015年获得信息系统项目管理师(高级),2014年获得系统集成项目管理工程师(中级)。 目前,我的课程都是围绕着“Java字节码”技术展开: 《Java Agent基础篇》是在一个运行JVM当中提供修改字节码的机会《Java ASM系列》(免费课程)是一个操作字节码的类库《Java 8 ClassFile》专注于字节码的理论知识,入选为“51CTO数字化人才证书项目认证课程” 因此,我对字节码技术有较为深入的研究和理解,大家想学习字节码的技术可以找我:字节码技术找刘森,轻松学习又省心~~~ 

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧