如题,我的意思是:按照“编译等效”的规则进行比较,而不是像diff那样比较文本行,能够处理:
1、两个.java中method的顺序是混乱的,例如左文件依次有a()、b()、c() method,右文件依次有c()、a()、d()、b() method,我希望比较结果是右文件多了d() method,而不是diff文本比较那样完全不同
2、.java中对编译结果无影响的空格、换行等等对比较也没有影响,编译等效的比较也相等。
请问,有这样的工具么?
还没见过这样的工具.
不过看你的意思,比较重在语意吧,可以借助反射包提取出Field,Constructor,Method的信息进行比较,但是这种比较无法识别出不同的方法体实现.
如果自己从文本分析开始,这个可能有点麻烦,首先把不同风格的代码转化成同一种风格,比如
public void test() {....}
public void test()
{....}
这两种风格的代码,你都先转化成
public void test() {
....
}
这样的格式,包括内部代码的整理.
然后以方法为单位加到一个数据结构中,然后比较这两个数据结构,将差异性记录下来.
PS:我对这种比较的结果很感兴趣,这两个方法头都一样,都实现根据Map的key对value进行一些处理,这里只是打印出value的值.
public void play(Map map) {
for (Map.Entry entry : map.entrySet()) {
System.out.println(entry.getValue());
}
}
public void play(Map map) {
for (String key : map.keySet()){
System.out.println(map.get(key));
}
}
如果你认为相等,那就用第一种方式,很容易就实现了,
如果认为不相等,那就把方法签名做键,方法体字符串做值放到一个Map中,先比较键,如果键相等再比较值.
还有就是重写的方法的比较,比如访问权限从package-private放大到public,或者返回类型是个子类型(1.5以后支持的协变返回类型),那么你是否还认为这两个方法是相同的,这是父子类之间的比较,那么兄弟类之类的比较结果呢,或者是两个没有关系的类之间的比较呢。
如果是文本分析的话,就不用考虑这些了,如果是编译结果的比较,那么这些应该考虑进去吧...
你可以把这个需求描述的再详细些.
com.sun.tools.javac.Main里面找找?