我从来没有用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,而不必从源代码中删除批注;批注处理器可以获得类和方法名。
这很容易做到吗?有什么食谱可以让我照着做吗?
它必须是Java5,所以我知道我必须在某个地方使用apt。
发布于 2010-10-30 10:53:05
使用标准的Java工具没有简单的方法可以做到这一点。阻力最小的方法几乎肯定是使用面向方面编程风格的库,如Google Guice、Spring或AspectJ。任何解决这个问题的尝试基本上都会以AOP库已经为您做的事情而告终。
发布于 2010-10-30 03:55:36
考虑使用AOP或Spring支持的注释来拦截方法调用并实现自定义代码
如果这听起来很有趣,Spring AOP文档在这里:http://static.springsource.org/spring/docs/2.5.x/reference/aop.html
您绝对可以自己编写注释解析器及其运行时实现,但与行业解决方案相比,重新发明只会容易出错且效率低下。
如果你坚持自己实现这个(没有AOP或使用Spring的AOP ),下面是我的建议(可能不是最好的方法):
new PerfLog()和bean包装对实际实例的方法的调用它实际上就是AOP (更强大的)为你做的事情。但是,请注意最终类、静态方法、没有接口的类等。在这种情况下仍然是一个问题(不同的球类比赛)。
https://stackoverflow.com/questions/4055360
复制相似问题