3

Java OpenGL GL インターフェースには約 2000 のメソッドが含まれています。デバッグの目的で、インスタンスをラップし、ロギング中にインスタンスへの呼び出しをデリゲートしたいと考えています。ロギング コードは、いずれの場合も同じメソッドにプッシュできるため、メソッドの実装を書き出すタスクは自動化できるように見えます。私がやろうとしていることの例:

import javax.media.opengl.GL;

public class GLErrorLogger implements GL {
  private final GL backing;

  public GLErrorLogger(GL delegateToMe) {
    backing = delegateToMe;
  }

  private void checkErrorCode() {
    // Log frame and thread details depending on gl state
  }

  /**
   * Example of a method
   */
  @Override
  public int glGenLists(int arg0) {
    checkErrorCode();
    int retVal = backing.glGenLists(arg0);
    checkErrorCode();
    return retVal;
  }

  // rest of methods here...
}

つまり、メソッド名とパラメーター (型を除く) をバッキング オブジェクトの呼び出しにコピーし、ログ メソッドへの呼び出しで囲み、戻り値の型がある場合は、結果をこの型の変数に割り当てて返します。メソッドの最後に。

メソッドを自動生成するための 1 回限りの Eclipse コード テンプレートの作成を検討しましたが、戻り値の型でパターン マッチングを行うすぐにわかる方法はありませんでした。Eclipseまたはそのコード生成ツールでこれを行う方法を誰かが提案して、正規表現ツールキットを引き出すのを節約できますか?

4

2 に答える 2

5

すべてのソース コードを生成する代わりに、アスペクトを使用して必要なバイトコードを作成することをお勧めします。ここでトレース アスペクトの例を見てみましょう:トレース アスペクトの例

別の方法として、AspectJ をサードパーティ ライブラリとして使用したくない場合は、Java 動的プロキシを作成できます。動的プロキシ チュートリアルを参照してください。

于 2012-08-03T07:52:44.027 に答える
2

提案どおりに JDK プロキシを使用するか、EasyMockMockitoなどのモック フレームワークを使用します。

GL mock = EasyMock.createMock(GL.class);
EasyMock.expect(mock.someMethod()).andReturn(someValue);
// or, if you need to do more computing:
EasyMock.expect(mock.someOtherMethod()).andAnswer(new IAnswer<String>() {
        public String answer() throws Throwable {
            return "some value you calculate here";
        }
    });
EasyMock.replay(mock);

mockこれで、構成したすべてのメソッドにオブジェクトを使用できます。詳細については、EasyMock の readmeを参照してください。

于 2012-08-03T08:01:50.920 に答える