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...
}

换句话说,将方法名称和参数(减去它们的类型)复制到对支持对象的调用中,围绕对日志记录方法的调用,如果有返回类型,则将结果分配给该类型的变量并返回它在方法结束时。

我查看了创建一次性 Eclipse 代码模板来自动生成方法,但是没有一种立即明显的方法来对返回类型进行模式匹配。任何人都可以建议一种在 Eclipse 或其任何代码生成工具中执行此操作的方法来节省我拉出正则表达式工具包的时间吗?

4

2 回答 2

5

您可能希望使用 Aspect 为您创建必要的字节码,而不是生成所有源代码。在此处查看 Traceing Aspect 示例:Traceing Aspect Example

作为替代方案,如果您不想将 AspectJ 用作第三方库,则可以创建 Java 动态代理。请参考动态代理教程

于 2012-08-03T07:52:44.027 回答
2

按照建议使用 JDK 代理,或者:使用像EasyMockMockito这样的 Mock 框架。

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);

现在您可以将mockObject 用于您配置的所有方法。有关详细信息,请参阅EasyMock 自述文件。

于 2012-08-03T08:01:50.920 回答