是否可以在不修改代码的情况下侦听实例的方法执行或类的所有实例? 类似的东西:
someInstance.addMethodExecutionListener('methodName', handler);
SomeClass.addMethodExecutionListener('methodName', handler);
这将用于记录目的......
答案 0 :(得分:5)
您所询问的是使用面向方面编程可以执行的操作的一小部分。普通Java及其实现不支持它,但它是AspectJ的主要原因。
答案 1 :(得分:2)
根据环境的不同,您可以使用不同的技术。 Spring提供Aspects,您可以绑定到某些事件(例如方法执行)。
如果您在Java EE容器托管环境中,则可以将Interceptors用于EJB,或SoapHandlers用于Web服务。
答案 2 :(得分:0)
一种方法是使用工具API JVMTI(替换单独的调试和分析API)。
否则,您可以重写类文件以在方法代码之前插入代码。这不一定容易。 ASM适用于较低级别的字节码操作,但您可能希望使用某些库(或编写自己的库)或可能使用某些“方面”工具。
可以在加载前轻松地在“光盘上”重写字节码,或者在运行时使用命令行上的instrumentation API和-javaagent:
重写字节码。