我想知道如何——如果可能的话——反映在执行期间在方法内部执行了哪些方法调用。我对外部方法调用(即其他类中的方法)或调用某些特定方法(如 getDatabaseConnection())特别感兴趣。
我的意图是监视方法内预定义对象的操作,并在满足某些特定条件时执行附加代码,例如使用特定值调用某些方法。监视器将是完全外部的类或一组类,除了反射之外无法直接访问要监视的对象。
我想知道如何——如果可能的话——反映在执行期间在方法内部执行了哪些方法调用。我对外部方法调用(即其他类中的方法)或调用某些特定方法(如 getDatabaseConnection())特别感兴趣。
我的意图是监视方法内预定义对象的操作,并在满足某些特定条件时执行附加代码,例如使用特定值调用某些方法。监视器将是完全外部的类或一组类,除了反射之外无法直接访问要监视的对象。
Aspect J将解决您的问题。
尝试像这样定义一个切入点:
pointcut profilling(): execution(public * *(..)) && (
within(com.myPackage..*) ||
通过这种方式,您将捕获对 com.myPackage 包中任何公共方法的所有调用。在您需要的子句中添加尽可能多的内容。
然后添加以下代码:
Object around(): profilling() {
//Do wherever you need before method call
proceed();
//Do wherever you need after method call
}
如果您想了解有关 aspectJ 的更多信息,请遵循本指南。
BCEL 应该提供这种能力,但是......
...您的要求听起来很像 Aspect-Oriented Programming (AOP),因此您可能还应该查看AspectJ(使用Eclipse 工具)。
AspectJ 的主要优点是它提供了一种精心设计的方式来表达您的特定条件。
我希望BCEL能够做到这一点。从网站:
字节码工程库旨在为用户提供方便的可能性来分析、创建和操作(二进制)Java 类文件(以 .class 结尾的文件)。
“分析”部分是这里的重要部分。JavaDoc 在网站上不可见(据我所知),所以我不能轻易确定它是否会对您有所帮助,但这是一个合理的起点。