如何提取一个java源文件的所有方法?

dddlgbb 2010-03-05 06:00:59
有个java源文件,希望提取其所有的方法,并把方法体抓取处理,如何做了?


import xxx;

public A{
private String v1;
public void f1(){
v2=v1+1;
}
prviate String v2;

}
现在希望把v2=v1+1;提取出来,如何做了?
...全文
595 39 打赏 收藏 转发到动态 举报
写回复
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
East271536394 2010-03-14
  • 打赏
  • 举报
回复
反射吧
pauliuyou 2010-03-14
  • 打赏
  • 举报
回复
既然有源文件,把原文件当成文本文件直接读取不就行了么? 还搞那么复杂?
problc 2010-03-13
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 dddlgbb 的回复:]
引用 17 楼 zxt12300 的回复:引用 15 楼 dddlgbb 的回复:我明确一下,我已经有源码,就是需要提前方法体啦。不需要反编译啦。 都有源码了,还不好提取吗?最直接的方法就是字符串分析了,找到这个方法体的典型特征,就可以截取出啊。方法体都有一对大括号,那么大括号之间的内容就是方法体了。

楼上的说得容易呀。我觉得是不是需要语法分析呀?
[/Quote]
public void f1(){
v2=v1+1;
}
看需求要求到什么程度了,商业级的话肯定要语法分析了。
一般用途的话,从方法名称后面的{开始,遇见{ push,遇见 }pop,栈为空时,即为方法体结束的位置。
shen8 2010-03-13
  • 打赏
  • 举报
回复
up--------
wanbosen 2010-03-13
  • 打赏
  • 举报
回复
学习中,怎么样才能得到方法体呢?
通过反射机制可以得到类中声明方法的描述符。
通过描述符,再对源文件中进行字符串操作,应该可以得到类中方法的方法体了。

sky123123 2010-03-13
  • 打赏
  • 举报
回复
顶起————————————
dddlgbb 2010-03-12
  • 打赏
  • 举报
回复
自己再up一下
zhuyouyong 2010-03-12
  • 打赏
  • 举报
回复
顶[Quote=引用 26 楼 polimo 的回复:]
楼主可以试下反射机制

Method method = 类.getClass().getDeclaredMethod("方法名", Object.class)
method.invoke(Object obj,
Object... args)
[/Quote]
上古玉清 2010-03-12
  • 打赏
  • 举报
回复
学习了
junjia 2010-03-12
  • 打赏
  • 举报
回复
这个问题是在是高啊
学习中
charles361 2010-03-12
  • 打赏
  • 举报
回复
如果楼主的意思是从源文件代码中提取可以用正则表达式,如果是源文件本身的可以用流,如果在具体解析,如果是对于类说,可以用反射,看你要什么结果了。
qq369759459 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zxt12300 的回复:]
引用 15 楼 dddlgbb 的回复:我明确一下,我已经有源码,就是需要提前方法体啦。不需要反编译啦。

都有源码了,还不好提取吗?
最直接的方法就是字符串分析了,找到这个方法体的典型特征,就可以截取出啊。
方法体都有一对大括号,那么大括号之间的内容就是方法体了。
[/Quote]
你说的不会是字符串截取吧?如果方法里有若干个IF-ELSE怎么办?而且方法的返回值是void该怎么搞?
bendanlzh 2010-03-10
  • 打赏
  • 举报
回复
不好意思,上面回帖!没有看到lz在后面回帖的具体需求!
编译原理,java cup
bendanlzh 2010-03-10
  • 打赏
  • 举报
回复
用ASM,太短了就多说点
或者是了解下原理,根据JMM(java 内存模型)自己去分析class文件
che253604783 2010-03-10
  • 打赏
  • 举报
回复
引用 8 楼 spiniper 的回复:
这应该是正则表达式与栈运算的综合运用,用正则匹配方法名格式,确定那是一个方法,然后用栈来处理大括号的开与闭。

正解
polimo 2010-03-10
  • 打赏
  • 举报
回复
楼主可以试下反射机制

Method method = 类.getClass().getDeclaredMethod("方法名", Object.class)
method.invoke(Object obj,
Object... args)
dddlgbb 2010-03-10
  • 打赏
  • 举报
回复
引用 24 楼 allysniper 的回复:
按住左键,选取你需要的某个或某几个方法 然后松开左键并点击右键,然后在按出来的菜单中选择复制,然后再到某个空白的可编辑处点击右建,再点击粘贴.
重复执行上述方法即可.

高,实在是高
allysniper 2010-03-10
  • 打赏
  • 举报
回复
按住左键,选取你需要的某个或某几个方法 然后松开左键并点击右键,然后在按出来的菜单中选择复制,然后再到某个空白的可编辑处点击右建,再点击粘贴.
重复执行上述方法即可.
dddlgbb 2010-03-10
  • 打赏
  • 举报
回复
不知道用正则表达式能解决这个问题不?
musiclee 2010-03-09
  • 打赏
  • 举报
回复
public private void 。。后面跟括号,括号下一行是{ 。。。。
无非是词法分析了呗,就要靠你强大的想象力 和组合能力了。。。。
加载更多回复(19)
相关推荐

62,567

社区成员

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