java如何获取类方法的参数名?

jadewoo 2010-09-15 06:24:47
public static String getRecourceOfCurrentUser(String resName, String operateKey)。
我想获取“resName”和“operateKey”,请教各位大虾有没有什么方法?
...全文
1694 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
哈库纳玛塔塔 2010-11-11
  • 打赏
  • 举报
回复
弱弱的问一句,你们在开发框架么? 一般系统 是不会有这种变态要求的。 大多数都通过文档解决。除非你们在开发框架。
哈库纳玛塔塔 2010-11-11
  • 打赏
  • 举报
回复
LZ 的问题我也遇到了,不过我是写自己的开源框架中。有一套Bean定义模型中有这个参数的要求,JDK本身就别指望有这个功能的支持了。

我这里有2种办法供你选择
1.使用javassist.jar 这个项目可以帮助你解决这个问题,它是一个增强的反射工具。
项目地址http://www.csg.is.titech.ac.jp/~chiba/javassist/
使用例子http://www.blogjava.net/Hafeyang/archive/2010/10/25/using_powerful_java_reflect_tool_javassist_to_getParameterAnnotations_and_getParameterNames.html
但是这个工具的运行效率没有ASM高。

你也可以使用ASM来扫描Class文件这样获取你要的属性名,前提是你需要对 Class字节码有比较深入的了解。

我更趋向于使用后者,但是ASM的API没有javassist方便。
小灰狼 2010-09-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jadewoo 的回复:]
引用 13 楼 hackerster 的回复:
谁知道楼主要干什么,如果是获取参数名的话,有嘛意义呢。

“参数名”是为了让方法调用者更好的明白具体要在方法里传入些什么内容,我当时接任务时,领导是这么说的
[/Quote]

这应该要看模块开发者写的API文档,光从变量名里看是不现实的

变量名不见得能体现参数的意义,比如有的人把参数名写成 arg1, arg2, arg3 这类形式

领导提个建议罢了,如果强制你这样做,那就是瞎指挥。
mgnewlegend 2010-09-20
  • 打赏
  • 举报
回复
方法名(); 掉方法啊
zhuyouyong 2010-09-20
  • 打赏
  • 举报
回复
太高深,我看不懂!
Jason8024Sun 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 bao110908 的回复:]
javap -v Test Test 是类名。

从第 4 行 Constant Pool: 开始会输出字节码常数池中的数据,里面就有方法名、方法签名,以及形式参数名。
[/Quote]
这个我给写错了!我改了一下!!!!!!!!!!!!!

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class getRecourceOfCurrentUser {

public static void main(String[] args) throws Exception {
Class cla = reflectT.class;
Field[] field = cla.getDeclaredFields();
Method[] methods = cla.getDeclaredMethods();
for (Method method : methods) {
if (method.getName() == "reflect1") {
System.out.println(method.getName());
for (Field field2 : field) {
System.out.print(field2.getType() + " " + field2.getName()
+ " " + "\n");
}

}
}

}

}

class reflectT {

private String resName;
private String operatekey;

public String getResName() {
return resName;
}

public void setResName(String resName) {
this.resName = resName;
}

public String getOperatekey() {
return operatekey;
}

public void setOperatekey(String operatekey) {
this.operatekey = operatekey;
}

public static String reflect1(String resName, String operatekey) {
return operatekey;

}

}

Jason8024Sun 2010-09-20
  • 打赏
  • 举报
回复
不好意思,我只是个初学者,只是拿来做做,大家见笑了

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class getRecourceOfCurrentUser {
public static void main(String[] args) throws Exception {
reflect rl = new reflect();
Class cla = reflectT.class;
Field[] field = cla.getDeclaredFields();
Method[] methods = cla.getDeclaredMethods();
for (Method method : methods) {
if (method.getName() == "reflect1") {
System.out.println(method.getName());
for (Field field2 : field) {
System.out.print(field2.getType() + " " + field2.getName()
+ " " + "\n");
}

}
}

}

}

class reflect {

public static String reflect1(String resName, String operatekey) {
return operatekey;

}

}

  • 打赏
  • 举报
回复
javap -v Test Test 是类名。

从第 4 行 Constant Pool: 开始会输出字节码常数池中的数据,里面就有方法名、方法签名,以及形式参数名。
  • 打赏
  • 举报
回复
反射是取不到的,如果在编译时使用默认选项的话,或者 javac 带有 -g:vars 编译参数的话,局部变量及方法形式参数名会在字节码中保存着,但是 Java 代码是访问不到的。

如果需要抽取字节码中的形式参数名称需要自己去了解 JVM 字节码规范自己去解析!
maquan 2010-09-16
  • 打赏
  • 举报
回复
看了半天,没搞清楚人物关系 :(

可否请楼主澄清下面几个问题:

1. getRecourceOfCurrentUser() 程序的提供者是谁?

2. getRecourceOfCurrentUser() 的使用者是谁?他有机会看到源代码吗?

3. 你的任务是什么?(感觉是要做一个编程辅助工具……)

■□■□■□■□■□■□■□■
□             □
■  忍以明志 勤以致远  ■
□             □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
huntor 2010-09-16
  • 打赏
  • 举报
回复
自己写个doclet抽取javadoc comments插入的应用系统中。
jadewoo 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 soli11722984 的回复:]
LZ啊,你自己去写个TEST类去,然后写好注释,去生成API看看什么效果,就不用再问我们了
[/Quote]
我要做的是在应用系统中显示该方法的信息,而不是生成API。
soli11722984 2010-09-16
  • 打赏
  • 举报
回复
LZ啊,你自己去写个TEST类去,然后写好注释,去生成API看看什么效果,就不用再问我们了
jadewoo 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 wangyq_412 的回复:]
呵呵,这领导??? 请问你拉倒参数名能知道往方法里传什么东西???参数名只要符合java命名规范相怎么写就怎么写,和类型、内容一点关系都没有,想不明白你要他做什么????? 除非你们老板规定参数就必须是这个名字?????

引用 16 楼 jadewoo 的回复:
引用 13 楼 hackerster 的回复:
谁知道楼主要干什么,如果是获取参数名的话,有嘛意义呢。

“参数名”是为……
[/Quote]
当时我告诉他,“参数名无法获取得到,参数名只是个符合,只要知道类型就行了,能否用参数1、参数2的名字去代替参数名?”,他坚决反对说,“参数1、参数2不能让用户明白是什么意思,必须要取参数实名”,我也无语。或许我还没真正了解需求,呵呵
jadewoo 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 maquan 的回复:]
引用 16 楼 jadewoo 的回复:
“参数名”是为了让方法调用者更好的明白具体要在方法里传入些什么内容,我当时接任务时,领导是这么说的
这个事情要靠文档啊,怎么想到反射去了?!

[/Quote]

我当时也有想获取文档的信息,但也不知道怎样去获取,请教这位仁兄有什么方法去获取得到?
如,获取resName 资源名称和operateKey 操作类型:/**
* 根据资源名和操作类型来获取资源ID
* @author CaiJiuFa
* @param resName 资源名称
* @param operateKey 操作类型
* @return 资源ID列表
*/
public static String getRecourceOfCurrentUser(String resName, String operateKey) {}
soli11722984 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 jadewoo 的回复:]

引用 17 楼 soli11722984 的回复:
引用 16 楼 jadewoo 的回复:

引用 13 楼 hackerster 的回复:
谁知道楼主要干什么,如果是获取参数名的话,有嘛意义呢。

“参数名”是为了让方法调用者更好的明白具体要在方法里传入些什么内容,我当时接任务时,领导是这么说的


确实是这样,不过,你要获得干嘛?
你方法写好了,公布个API,那时参数名……
[/Quote]

………………
我彻底无语,公布API就好了,API就是给别人看的文档,给别人去调用
maquan 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jadewoo 的回复:]
“参数名”是为了让方法调用者更好的明白具体要在方法里传入些什么内容,我当时接任务时,领导是这么说的[/Quote]
这个事情要靠文档啊,怎么想到反射去了?!

--------
With sufficient thrust, pigs fly just fine. However, this is not necessarily a good idea. It is
hard to be sure where they are going to land, and it could be dangerous sitting under them as they
fly overhead.

————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
WANGYQ_412 2010-09-16
  • 打赏
  • 举报
回复
呵呵,这领导??? 请问你拉倒参数名能知道往方法里传什么东西???参数名只要符合java命名规范相怎么写就怎么写,和类型、内容一点关系都没有,想不明白你要他做什么????? 除非你们老板规定参数就必须是这个名字?????
[Quote=引用 16 楼 jadewoo 的回复:]
引用 13 楼 hackerster 的回复:
谁知道楼主要干什么,如果是获取参数名的话,有嘛意义呢。

“参数名”是为了让方法调用者更好的明白具体要在方法里传入些什么内容,我当时接任务时,领导是这么说的
[/Quote]
jadewoo 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 soli11722984 的回复:]
引用 16 楼 jadewoo 的回复:

引用 13 楼 hackerster 的回复:
谁知道楼主要干什么,如果是获取参数名的话,有嘛意义呢。

“参数名”是为了让方法调用者更好的明白具体要在方法里传入些什么内容,我当时接任务时,领导是这么说的


确实是这样,不过,你要获得干嘛?
你方法写好了,公布个API,那时参数名已经写好在代码里面,那么还要再获得???
[/Quote]

我要做的通过反射机制,把方法名,方法的参数类型和参数名一起暴露出来,如果用户想调用这个方法时,可以更好地去理解它和调用它
soli11722984 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jadewoo 的回复:]

引用 13 楼 hackerster 的回复:
谁知道楼主要干什么,如果是获取参数名的话,有嘛意义呢。

“参数名”是为了让方法调用者更好的明白具体要在方法里传入些什么内容,我当时接任务时,领导是这么说的
[/Quote]

确实是这样,不过,你要获得干嘛?
你方法写好了,公布个API,那时参数名已经写好在代码里面,那么还要再获得???
加载更多回复(15)

62,616

社区成员

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

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