是否有可能在不修改代码的情况下侦听实例的方法执行或类的所有实例? 喜欢的东西:有没有办法监听另一个类的方法执行?
someInstance.addMethodExecutionListener('methodName', handler);
SomeClass.addMethodExecutionListener('methodName', handler);
这将是用于日志记录...
是否有可能在不修改代码的情况下侦听实例的方法执行或类的所有实例? 喜欢的东西:有没有办法监听另一个类的方法执行?
someInstance.addMethodExecutionListener('methodName', handler);
SomeClass.addMethodExecutionListener('methodName', handler);
这将是用于日志记录...
什么你问的是,你可以用面向方面的编程做一小部分。它在普通Java及其实现中不受支持,但它是AspectJ的核心原因。
根据环境的不同,您可以使用不同的技术。 Spring提供Aspects,您可以绑定到某些事件(例如方法执行)。
如果您处于Java EE容器托管环境中,则可以使用EJB的Interceptors或Web服务的SoapHandlers。
一种方法是使用工具API JVMTI(替换独立的调试和性能分析API)。
否则,您可以重写类文件以在方法代码之前插入代码。这并不容易。 ASM适用于较低级别的字节码操作,但您可能需要使用某个库(或自己编写)或可能使用某些“方面”工具。
在加载之前,或者在运行时在命令行上使用instrumentation API和-javaagent:
,可以轻松地将“字节码”重写为“在光盘上”。
那么你想要什么。每次执行'methodName()'函数时都需要通知吗? –
的确如此,并且不需要修改Class代码。 –