寻找Java Annotation的简单配方

时间:2010-10-29 19:47:05

标签: java annotations

我从未在Java中编写过注释。

我有一个简单的Java类用于性能测量。我称之为PerfLog。以下是其使用示例:

public class MyClassToTest {
  public String MyMethod() {
    PerfLog p = new PerfLog("MyClassToTest", "MyMethod");
    try {
       // All the code that I want to time.
       return whatever;
    } finally {
       p.stop();
    }
  }
}

调用p.stop()时,会将一行写入日志文件:

2010/10/29T14:30:00.00 MyClassToTest MyMethod elapsed time: 00:00:00.0105

可以将PerfLog重写为注释,以便我可以写这个吗?

public class MyClassToTest {
  @PerfLog
  public String MyMethod() {
    // All the code I want to time.
    return whatever;
  }
}

它似乎是一个很好的候选注释:添加或删除注释很容易;生产构建可以完全忽略PerfLog,而无需从源代码中删除注释;注释处理器可以获取类和方法名称。

这很容易吗?有没有我可以遵循的食谱?

它必须是Java 5所以我知道我必须在某处使用apt。

2 个答案:

答案 0 :(得分:1)

考虑使用AOP或Spring - 支持Annotations来拦截方法调用并实现自定义代码

如果听起来很有趣,那么Spring AOP文档就在这里:http://static.springsource.org/spring/docs/2.5.x/reference/aop.html

您绝对可以自己编写注释解析器及其运行时实现,但与行业解决方案相比,重新发明只会出错并且效率低下。

如果你坚持自己实现这个(没有使用Spring的AOP或AOP),我可以建议这里(可能不是最好的方法):

  1. 始终通过自定义FactoryBean创建bean。
  2. 在自定义FactoryBean实现中,查询类的方法并检查它们是否已注释。
  3. 如果是,则不是返回类本身的实例,而是在实例上返回代理。
  4. 在调用此代理时,使用new PerfLog()p.stop()
  5. 将调用包装到实际实例的方法中

    它实际上是AOP(更有力)为你做的事情。但是,请注意最终类,静态方法,没有接口等的类......在这种情况下仍然是一个问题(一个不同的球类游戏)。

答案 1 :(得分:1)

使用标准Java工具执行此操作并不是一件容易的事。阻力最小的路径几乎肯定是使用像Google Guice或Spring或AspectJ这样的AOP风格的库。任何解决这个问题的本土尝试都将最终完成AOP库已经为您做的事情。