2009-01-16 24 views
2

我正在尋找一種方法來在編譯時刪除特定類的所有用途,包括類本身。基本上是一種預處理的形式,但我想這樣做,而不必使用#ifdebug ... #endif包圍所有實例。在編譯時刪除某些Java類的使用

是否有任何基於螞蟻的工具可以做到這一點?如果沒有,任何人都可以指出我如何編寫這樣一個工具的正確方向? (不是我知道的小事,但如果它是唯一的選擇......)

情況是我有一個幫助類用於調試函數調用。這是在函數的開始處實例化的,並在最後進行調用。這是一個JavaME應用程序,所以我很擔心這會增加性能。我已經有了一個使用ProGuard的預處理器指令的發佈和調試版本,所以我想從發佈版本中排除使用這個幫助器類。這似乎不能用ProGuard完成。

+0

幫助類用於調試函數調用...... 性能測試? – 2009-01-16 18:23:21

+0

`#ifdebug`在Java中不是已知的關鍵字,但是您可以使用DEBUG常量,如[here](http://www.devx.com/tips/Tip/12441)所述。 – 2012-01-26 23:19:18

回答

1

你知道這個調試代碼會讓JavaME應用變慢嗎?您也可以嘗試創建一種有條件地調用這些調試方法的方法。

一些更多的想法......我從來沒有寫過JavaME應用程序,但我認爲有辦法在實際設備上運行/測試。鑑於這種運行/測試方式,也許您可​​以使用Eclipse/Netbeans來調試您的代碼並使用適當的斷點,而不是通過編程方式跟蹤方法調用。在這種情況下不會損害編譯代碼。另外考慮使用AspectJ來跟蹤方法調用,這可以在代碼編譯後有條件地完成,因爲AspectJ直接改變字節碼(不知道它如何與JavaME一起使用)。最後,我聽說有人在Java上使用標準的GNU C/C++預處理器。我不知道它是否有效,谷歌會幫助你。

3

「這是在一個函數的開始實例化,並呼叫在結束時進行。」

如果這是在你的代碼也許你需要看看AOP。

或爲輔助類的狀態設計模式,在測試模式下它的一件事,但在督促它另一個(像什麼)

+0

你可以在JavaME中使用AOP嗎?快速谷歌沒有透露任何結論... – 2009-01-16 18:57:32

0

不是你想要什麼,但...
你可以分開的代碼到模塊(核心和調試,在你的情況),然後確保模塊通過反射互相調用:使用核心中可用的接口,在覈心創建一個包裝類,通過反射細節隱藏對象實例化/ 然後,在生產,如果實例化失敗/設置特定標誌,則省略調試代碼並使包裝器「無所作爲」。

這樣,你的調試類將不會進入生產,你將不必「靜態鏈接」它們,所以你的核心生產代碼不會在意。 當然,這隻有在您的調試代碼沒有核心代碼可見的副作用時纔有可能,但似乎這是您的情況(來自您的問題描述)。

0

是否可以在應用程序啓動時僅創建一次類,而不是爲每個方法創建實例?您的調試類可能如下所示:

public class Debug // maybe make this a *gasp* singleton? 
{ 
    public static void start(); // called at start of method 
    public static void end(); // called at end, probably should be in a finally block 

    public static void setDebugMode(boolean debugOn); // turn off for production mode 
} 

在測試中將調試模式設置爲「true」,但生產中將「debug」設置爲「false」。當調試模式關閉時,所有方法都不會執行任何操作(當然,除了檢查調試模式的狀態外)。

您不避免函數調用的開銷,並且您確實需要檢查該布爾值的狀態,但是您的確可以避免跳過環路,試圖避免加載類。

如果您還有多線程應用程序,則需要更多工作。