jvm java运行时如何获取方法的参数名和参数值
我现在想写一个log输出,输出格式大体有这几个:类名,方法名,{{参数名:参数值}, ...}
在java的本身中只提供了 “类名,方法名”这两个获取方法,方法的参数名jdk<1.8时,读字节码;jdk>=1.8时,反射;但是参数值只能是运行时拿到,所以我下了openjdk源码,希望有人能给我指点一下,获取{参数名:参数值}去c++的哪里可以拿到,给我指条路,多谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
思路错了吧。。。
另外,JDK 1.8 以下,读字节码默认也是获取不到参数名的。
这应该分成两个问题,1.如何获取参数值. 2.如何获取参数名,
1.如何获取参数值。这个是运行时的数据,你程序处理下获取就好了。比如写一个代理
2.参数名是在编译的时候就写入到class文件的。,而这些方法的参数在class中就是一个局部变量。class对于局部变量的定义和存储专门有张表。
单纯通过反射目前好像没有办法,通过字节码解析倒是可以
比如下面代码
public static void staticMethod(String args1, String args2) {
}
局部变量表:
[pc: 0, pc: 1] local: args1 index: 0 type: java.lang.String
[pc: 0, pc: 1] local: args2 index: 1 type: java.lang.String
pc 0是每个字节码指令的程序计数器。[pc: 0, pc: 1] local: args1 index: 0 type: java.lang.String就是说在程序第0个指令到第1个指令的局部变量数组下标为0的变量类型是String变量名是args1.
public static void nonStaticMethod(String args1, String args2) {
}
局部变量表;
[pc: 0, pc: 1] local: this index: 0 type: asmtest.Test
[pc: 0, pc: 1] local: args1 index: 1 type: java.lang.String
[pc: 0, pc: 1] local: args2 index: 2 type: java.lang.String
这个方法比上面的方法多了一个this。因为这个方法是非静态方法。
所以如果要获取参数名需要解析字节码。这里给你一段代码使用ASM
使用asm版本是
这里存在一个隐患,如果有些class文件做了加密混淆吧局部变量表里面的变量名改变了,那就没法获得源码级别的参数名了。