是否可以监视对 Java 类的实例进行的方法调用。我知道我可以使用java.lang.reflect.InvocationHandler
. 我想知道是否还有其他更简单的方法不涉及修改类的源代码?
编辑:例如java.util.HashMap
。这个类的源代码不可用 - 至少对我来说它不是在 Oracle 的 JDK 下运行时。我将如何拦截对 put(...) 方法的调用。我想检查调用中的参数。
是否可以监视对 Java 类的实例进行的方法调用。我知道我可以使用java.lang.reflect.InvocationHandler
. 我想知道是否还有其他更简单的方法不涉及修改类的源代码?
编辑:例如java.util.HashMap
。这个类的源代码不可用 - 至少对我来说它不是在 Oracle 的 JDK 下运行时。我将如何拦截对 put(...) 方法的调用。我想检查调用中的参数。
您可以使用Aspect Oriented Programming来做到这一点。你只需要声明你想要“窥探”的代码的切入点。简而言之-您可能会声明注释,将它们放在方法签名之上,并且所有带注释的方法都可能在编译时由编译器修改(或在将字节码加载到 jvm 时进行修改),而无需修改其源代码.
AspectJ对此很有用。
你可以试试JMSPY。Jmspy 是一个 java 库,它允许记录 java 方法调用,将数据保存到一个名为快照的文件中,并使用 jmspy 查看器对其进行分析。
看看AspectJ。它允许您在方法调用中插入钩子,并在方法主体运行之前和之后执行任意代码。它使用自定义类加载器解决了这个问题。
我建议研究允许分离横切关注点(日志等)的面向方面的编程。
这样,为您的方法指定切入点,您可以“窥探”这些方法。