2015-10-27 22 views
0

我目前正在參加一個項目管理課程,教授給了這個任務,以便在所有情況下以編程方式比較兩個.java文件的方法和字段。 我不認爲這是真的可以做但也許我錯了!是否有可能在所有情況下比較兩個.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文件」 - 這是完全正確的但我也在想,不可能做到。

我想明確一個具體的答案,爲什麼這實際上不可能做或學習新的東西,爲什麼這是可能的,所以任何洞察力將是偉大的。

+0

絕對不是不可能的。看看https://github.com/javaparser/javaparser。看起來你可以解析2個java文件並查找更改。 –

+0

感謝您的鏈接! – Shaun314

回答

1

這裏你錯了什麼是你已經開始檢查.class文件(使用反射)。上面列出的一些信息在該階段還沒有提供(泛型,內聯函數)。你需要做的是將.java文件解析爲文本。這是真正解決問題的唯一方法。一個非常高層次的解決方案,可以編寫一個程序:

  • 讀取文件
  • 構建一個特定的對象包含所有信息的每個java文件,需要進行比較的功能,姓名(名稱實例變量等)
  • 的構造的對象進行比較的(例如:addedFunctions = functionsFromA.removeAll(functionsFromB)),以提供所要求的結果

注:如果這是一個任務,你不應該使用解決方案由其他人提供,你需要自己做。如果你使用其他人編寫的圖書館,你可能得不到一分。

+0

謝謝Gergely,我已經完成了任務和一切,我只是在好奇這一點。解析器不是必須非常強大才能處理像泛型和內聯函數這樣的事情嗎?我已經考慮過解析所有東西,但是提出了很多例外來說明它沒有意義。這是一項定期的家庭作業,我們每兩週會收到一份新作業。也許我高估了工作量,但創建一個解析器來完成這項工作似乎是一項令人難以置信的艱鉅任務。是不是真的不好? – Shaun314

+0

與使用反射相比,它確實很容易。 :)但真的:你需要發現的物品清單是非常基本的,如果你有足夠的經驗,你應該可以在4-6小時內解決。真正例外的情況(不同類型的內部類,靜態初始化塊,通配符導入)不屬於你的任務,那些將是棘手的事情追蹤。 –

相關問題