随笔-8  评论-31  文章-0  trackbacks-0

去年为了公司的Junit需求做了一个检测我们的代码是否有Junit Test Class的一个小Tool, 今天又翻出来看了下,觉得里面的有个小功能可能对大家有用,如果你也觉得有用,我觉得很荣幸。:)

1.用途:
指定一个类, 分析出类中所有方法的精确位置- 也就是某个方法在哪两行之间。
(大家可以考虑一下怎么做,然后再看看我的方法是不是太笨了。-_-!!)

2.用法:
新建一个类,将这几行代码加到mail方法,例如:

示例使用代码

[补充]: CVSParseMethod的构造函数是CVSParseMethod(String String1,String String2), String1是目标的java文件在文件系统的位置,String2是类的全名..如net.blogjava.xmp123.CVSClass.
BTW:不要忘记将后面download的jar导过来。

结果会打在Console里,象这样:

Loading net.blogjava.xmp123.CVSClass
Loaded net.blogjava.xmp123.CVSClass
Found java source file in C:\Documents and Settings\hut\workspace\AccountMethodLocation
/ net / blogjava / xmp123 / CVSClass.java
Parsing net.blogjava.xmp123.CVSClass
Parsed a common 
class  and brackets can matched the methods correctly
MethodParseEngine have searched 
10  methods(Including constructors).
Completed :Spend 
0.187  seconds to parse  this  file.
[
public  CVSClass(String) locate between  52  and  123
public  CVSMethod[] getCvsMethodArray() locate between  128  and  130
public  CVSConstructor[] getCvsConstructorArray() locate between  135  and  137
public  Set getMethodSet() locate between  142  and  144
public  Set getConstructorSet() locate between  149  and  151
public  String getClasspath() locate between  156  and  158
public  List getMethodList() locate between  163  and  165
public  String getClassName() locate between  174  and  176
public   boolean  equals(Object) locate between  183  and  188
public   int  hashCode() locate between  193  and  196
]

3. 我是怎么做的。

.用java反射拿出所有的的类的构造函数和方法。
.读java源文件,通过匹配左右括号来匹配方法并记录出合适的位置。

4. 存在的问题:
到目前为止,这个小程序至少不能分析它自己的主类:CVSParseMethod(很多Exceptions), 因为这个类里面定义的一些String中含用 { }而导致匹配的时候出错。呵呵。但是我保证,它应该在>90%的概率下正常工作。:) 

5. 下载的地址:

http://www.blogjava.net/Files/xmp123/CountMethodLocation.zip
posted on 2007-03-12 15:40 自己的小屋 阅读(2236) 评论(9)  编辑  收藏

评论:
# re: 定位Java类中的每个方法在类文件中的位置. [未登录] 2007-03-12 16:25 | 蚂蚱
很早以前写java源代码编辑器时也遇到过{}匹配的问题,处理“”中的部分很麻烦,我也没有做成功。为了保证可以用其他方法实现,先找出方法的起始位置,再找出下一个方法的起始位置(查找方法通过private 或public修饰符关键字),两个中间就是方法的代码了。但有个问题,要求代码中方法和成员变量不要含有默认scope声明,例如:int i;必须用private|public|protected int i;就可以了。  回复  更多评论
  
# re: 定位Java类中的每个方法在类文件中的位置. 2007-03-12 17:02 | BeanSoft
想法很不错. 可以试试 QDox http://qdox.codehaus.org/ 专业的开源Java源码解析工具, 能把源码分析成结构化的组织. 可以看看实际使用: http://beansoft.java-cn.org/Wiki.jsp?page=QuickJavaDocPlugin 从源码里提取 JavaDoc 并根据不同的类型加以颜色.  回复  更多评论
  
# re: 定位Java类中的每个方法在类文件中的位置. 2007-03-12 18:12 | Javacap
最直接的办法应该是分析class的bytecode,找到每个Method_info->Code Attribute->LineNumberTable Attribute ,  回复  更多评论
  
# re: 定位Java类中的每个方法在类文件中的位置. 2007-03-13 12:47 | wanglinghua
你所说的方法对代码的要求太苛刻。并且默认的方法修饰符是java中访问控制中特色的一种,如果象此类的代码都解析不了,那可能这个方法就有问题。

就我所知,括号的匹配问题至少有:

1. 排除类中static域。这东西从括号上讲和一个方法一模一样。-未实现

2. 排除类成员变量中数组的申明赋值,比如说:int[] x = { 1,2,3,4,5}
[我可以找到第一个方法(也可能是构造函数的位置,如果在此之前有括号匹配成功,那么必然是类似的情况] -已实现。

3. 匿名内部类在成员变量的申明。例如:

Dog dog = new Dog() {public void shout() {}}; -未实现。

4. 代码注释中含有{} ,这样的情况太常见。-已实现。

5. 代码中的某个String含有 { } 之类的字符。

你对Java知道得越多,当然想到的情况越多。也会感觉这东西很麻烦。

:) @蚂蚱
  回复  更多评论
  
# re: 定位Java类中的每个方法在类文件中的位置. 2007-03-13 12:48 | 王凌华
@Javacap

这是JVM的东西,我昨天又翻了一下我已经买了很久的Inside JVM,但是总是翻不下去。:(   回复  更多评论
  
# re: 定位Java类中的每个方法在类文件中的位置. 2007-04-27 14:15 | 执手麦田
目前还没有到达这一步,正在努力中。在这过程中也希望能有您这样的高手指点一二。  回复  更多评论
  
# re: 定位Java类中的每个方法在类文件中的位置. 2007-04-27 14:20 | 王凌华
我刚在你blog留言,你又来踩我的了。有缘.
@执手麦田
  回复  更多评论
  
# re: 定位Java类中的每个方法在类文件中的位置. 2007-04-27 16:56 | 执手麦田
呵呵,以后JAVA里有问题还要多多请教呢。  回复  更多评论
  
# re: 定位Java类中的每个方法在类文件中的位置. 2007-04-27 17:29 | 王凌华
@执手麦田

多写写,我们互相踩踩,共同提高. :)  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: