2009-09-30 18 views
1

據我所知,JVM每個方法的編譯代碼有64KB的限制。我有一個生成要運行的Java代碼的工具,有時生成的代碼包含比這更長的方法。是否有一種使用過長(> 64kb編譯)方法轉換Java代碼的自動方法?

是否存在一種自動的方式來將一個Java類文件用過長的方法轉換成一個產生相同結果但可以編譯的結果?

在一個簡單的例子,以下代碼:

public void longMethod 
{ 
    doSomething1(); 
    doSomething2(); 
    /* snip */ 
    doSomething20000(); 
} 

可能被轉化爲:

public void longMethod 
{ 
    longMethod_part1(); 
    longMethod_part2(); 
    /* snip */ 
    longMethod_part10(); 
} 

public void longMethod_part1() 
{ 
    doSomething1(); 
    /* snip */ 
    doSomething1000(); 
} 

/* snip */ 

public void longMethod_part10() 
{ 
    doSomething9001(); 
    /* snip */ 
    doSomething10000(); 
} 

然而,存在的併發症,例如很長的方法可能是一個非常長的鏈。即使一般情況太困難,盡力而爲的工具也會引起人們的興趣。

編輯:幾種善意的人建議修復生成這些長方法的工具。雖然這是一個很好的想法,但我不能利用這一點。我仍然歡迎任何關於我在上面提出的一般問題的想法。

+6

在我看來,唯一可行的方法是修復產生這個混亂的工具。要麼讓它分裂它的方法,要麼更好:擺脫這種巨大方法的需要。 – 2009-09-30 14:58:08

+0

不幸的是修復這個工具並不是一個真正的選擇。 – 2009-09-30 15:18:18

+0

另外,上面的例子僅用於說明。真正的代碼不會這麼簡單。 – 2009-09-30 15:25:30

回答

1

例如Eclipse中存在安全工具,但它們是爲開發人員使用的。我認爲重構「提取方法」的,具有很好的性能:

  • 修復自動調用代碼
  • 保證是正確的

我想這不符合您的需要,你會喜歡沒有人類行爲的東西,不是嗎?

也許一些工具對能力建設......


我也支持固定:-)

代碼工具的約阿希姆的建議可以用簡化:

  • 調用的通用序列,定義它們(甚至手動),並讓工具識別它們;它會簡單地給他們打電話,結果會更短。
  • 更改數據序列的代碼序列:不是組合方法調用,而是具有讀取數據的代碼循環,併爲每個數據執行正確的作業。關鍵是數據可以來自任何結構(文件,流,數據庫),它不一定是代碼。

我喜歡史蒂夫的評論也。也許,如果您無法修復代碼,並且無法修復該工具,則必須修復作者

也許有可能以不同的方式,這使得它的結果不是那麼糟糕使用的工具...

+0

修復工具並不是一個真正的選擇 – 2009-10-12 21:46:48

0

顯然,如果一個人的選擇,修改生成工具打散大類將是最簡單的選擇。如果這不能完成,你需要另一個答案。

64Kb限制是Java編譯器強加的任意限制,而不是Java本身。爲了解決這個問題,你需要一個工具,它能夠以與Java編譯器相同的準確度解析Java源代碼,估計生成的字節代碼量,並將大類轉換爲不違反限制的類。

你需要的是一個Java源代碼分析和轉換系統。 (字節碼分析器顯然不會工作,因爲您無法讓編譯器爲超過64Kb的文件生成字節碼)。

DMS Software Reengineering Toolkit可以配置完成此任務。這不是一個現成的解決方案(但是你的問題也不是標準的),但是爲了做到這一點,處理代碼是很實際的。不過,配置DMS來做這件事不是下午的工作。

相關問題