是否可以在所有情况下比较两个.java文件方法和字段?

时间:2015-10-27 06:39:04

标签: java performance reflection compare

我目前正在参加一个项目管理课程,教授给出了这项任务,以编程方式比较所有情况下的两个.java文件方法和字段。 我认为实际上不可能,但也许我错了!

作业规范如下(我知道它非常模糊)

In this assignment, you are required to write a comparison tool for two 
versions of a Java source file.
Your program takes as input two .java files representing those two versions
and reports the following atomic changes:

1. AM: Add a new method
2. DM: Delete a method
3. CM: Change the body of a method (note: you need to handle the case where a method is
relocated within the body of its class)
4. AF: Add a field
5. DF: Delete a field
6. CFI: Change the definition of an instance field initializer (including (i) adding an initialization to a
field, (ii) deleting an initialization of a field, (iii) making changes to the initialized value of a field,
and (iv) making changes to a field modifier, e.g., private to public)

这就是我正在使用的方法,我的方法是使用反射,因为它允许你做所有事情,但检测方法体中的差异。

我曾考虑过你可以创建一个解析器,但这看起来很荒谬,特别是对于项目管理中的3学分本科课程。像BeyondCompare这样的工具不会列出哪些方法或字段发生了变化,只列出了不同的行,因此不符合要求。

我完成了这项任务,几乎整个课都失败了,理由是“我们的代码不适用于没有给出外部依赖关系的java文件或者不同项目中的java文件” - 这是完全正确的但是我也在想,不可能做到。

我正试图找出一个具体的答案,说明为什么实际上不可能这样做,或者为什么会这样做有新的东西,所以任何见解都会很棒。

1 个答案:

答案 0 :(得分:1)

你在这里遇到的错误是你已经开始检查.class文件(使用反射)。上面列出的一些信息甚至在那个阶段都没有(泛型,内联功能)。您需要做的是将.java文件解析为文本。这是实际解决问题的唯一方法。一个非常高级的解决方案可能是编写一个程序:

  • 读取文件
  • 为每个.java文件构造一个特定对象,其中包含需要比较的所有信息(函数名称,实例变量名称等)
  • 比较构造的对象(例如:addedFunctions = functionsFromA.removeAll(functionsFromB))以提供请求的结果

注意:如果这是一项任务,您不应该使用其他人提供的解决方案,您需要自己完成。如果您使用其他人编写的库,可能您不会得到任何一点。