随笔-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 自己的小屋 阅读(2327) 评论(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 | 王凌华
@执手麦田

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

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


网站导航: