代码之家  ›  专栏  ›  技术社区  ›  Mark Lutton

寻找Java注释的简单方法

  •  3
  • Mark Lutton  · 技术社区  · 16 年前

    我从来没有用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();
        }
      }
    }
    

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

    这容易吗?有什么食谱我可以遵循吗?

    它必须是Java 5,所以我知道我必须在某个地方使用apt。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Mike Clark    16 年前

    使用标准的Java工具没有简单的方法可以做到这一点。阻力最小的方法几乎肯定是使用像Google Guice、Spring或AspectJ这样的AOP风格的库。任何本土的解决这个问题的尝试最终都会像AOP库已经为您做的那样。

        2
  •  1
  •   madhurtanwani    16 年前

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

    http://static.springsource.org/spring/docs/2.5.x/reference/aop.html

    您当然可以自己编写注释解析器及其运行时实现,但与行业解决方案相比,重新设计只会容易出错,效率低下。

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

    1. 始终通过自定义的FactoryBean创建bean。
    2. 在定制的FactoryBean实现中,查询类中的方法并检查它们是否被注释。
    3. 如果是,则不返回类本身的实例,而是返回实例上的代理。
    4. 在这个代理的调用中,用 new PerfLog() 和 p.stop()

    这正是AOP将(更有力地)为您做的事情。但是,请注意,最终类、静态方法、没有接口的类等。。在这种情况下(另一种球赛)仍然是个问题。