我目前正在上一门项目管理课程,教授给我布置了这个作业,用编程的方式比较两个。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文件在不同的项目"-这是完全正确的,但我也在想,不可能做到。
我试图确定一个具体的答案,为什么这实际上是不可能的,或者学习一些新的东西,为什么这是可能的,所以任何见解将是伟大的
这里的错误是您已经开始检查.class文件(使用反射)。上面列出的一些信息在那个阶段甚至是不可用的(泛型、内联函数)。您需要做的是将.java文件解析为文本。这是真正解决问题的唯一方法。一个非常高级的解决方案可以是编写这样一个程序:
- 读取文件
- 为每个.java文件构造一个特定的对象,其中包含需要比较的所有信息(函数名,实例变量名等)
- 比较构造的对象(例如:adddedfunctions = functionsFromA.removeAll(functionsFromB))来提供请求的结果
注意:如果这是一个作业,你不应该使用别人提供的解决方案,你需要自己做。如果你使用的是别人写的库,很可能得不到一分。