2

コンパイル時に、クラス自体を含め、特定のクラスのすべての使用を削除する方法を探しています。基本的には前処理の形式ですが、すべてのインスタンスをで囲む必要なしに実行したいと思います#ifdebug ... #endif

これを実行できるAntベースのツールはありますか?そうでない場合、誰かがそのようなツールを書く方法について正しい方向に私を向けることができますか?(私が知っているマイナーな事業ではありませんが、それが唯一の選択肢である場合は...)

状況は、関数呼び出しをデバッグするためのヘルパークラスがあることです。これは関数の最初にインスタンス化され、最後に呼び出しが行われます。これはJavaMEアプリケーションであるため、パフォーマンスに追加されるオーバーヘッドについて心配しています。ProGuardを使用するプリプロセッサディレクティブを持つリリースビルドとデバッグビルドがすでにあるので、このヘルパークラスの使用をリリースビルドから除外したいと思います。これはProGuardで実行できるようには見えません。

4

4 に答える 4

3

「これは関数の先頭でインスタンス化され、最後に呼び出しが行われます。」

これがコード全体にある場合は、AOP を調べる必要があるかもしれません。

またはヘルパークラスの状態設計パターン。テストモードでは1つのことを行いますが、本番環境では別のことを行います(何もしないように)

于 2009-01-16T18:25:15.840 に答える
1

このデバッグ コードが JavaME アプリを遅くすることをご存知ですか? これらのデバッグ メソッドを条件付きで呼び出す方法を作成することもできます。

さらにいくつかのアイデア... JavaMEアプリを書いたことはありませんが、実際のデバイスで実行/テストする方法があると思います。この実行/テスト方法を考えると、メソッド呼び出しをプログラムでトレースする代わりに、Eclipse/Netbeans を使用してコードをデバッグし、適切なブレークポイントを使用することができます。この場合、コンパイルされたコードに害はありません。また、AspectJ を使用してメソッド呼び出しをトレースすることも検討してください。AspectJ はバイトコードを直接変更するため、これはコードのコンパイル後に条件付きで実行できます (これが JavaME でどのように機能するかはわかりません)。最後に、Java で標準の GNU C/C++ プリプロセッサを使用している人々について聞いたことがあります。それが機能するかどうかはわかりません。Googleがお手伝いします。

于 2009-01-16T18:24:36.590 に答える
0

メソッドごとにインスタンスを作成する代わりに、アプリケーションの起動時にクラスを1回だけ作成することは可能ですか?デバッグクラスは次のようになります。

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」に設定しますが、本番環境では「false」に設定します。デバッグモードがオフの場合、どのメソッドも何もしません(もちろん、デバッグモードの状態を確認することを除いて)。

関数呼び出しのオーバーヘッドを回避することはできません。また、そのブール値の状態を確認する必要がありますが、クラスのロードをまったく回避しようとしてフープを飛び越えないようにすることができます。

マルチスレッドアプリケーションを使用している場合も、これにはさらに作業が必要になります。

于 2009-01-16T18:41:32.000 に答える
0

正確にはあなたが望むものではありませんが...
コードをモジュール(あなたの場合はコアとデバッグ)に分離し、モジュールがリフレクションを介して互いに呼び出すようにすることができます:コアで利用可能なインターフェイスを使用し、コアでラッパークラスを作成しますリフレクションの詳細を介してオブジェクトのインスタンス化を非表示にします/その後、本番環境では、インスタンス化が失敗した場合/特定のフラグを設定した場合に、デバッグコードを省略してラッパーを「何もしない」ようにします。

この方法では、デバッグ クラスが本番環境に移行せず、それらに「静的にリンク」する必要がないため、コアの本番コードは気にしません。もちろん、これはデバッグ コードにコア コードから見える副作用がない場合にのみ可能ですが、(問題の説明から) それはあなたのケースのようです。

于 2009-01-16T18:35:34.087 に答える