1

是否可以监视对 Java 类的实例进行的方法调用。我知道我可以使用java.lang.reflect.InvocationHandler. 我想知道是否还有其他更简单的方法不涉及修改类的源代码?

编辑:例如java.util.HashMap。这个类的源代码不可用 - 至少对我来说它不是在 Oracle 的 JDK 下运行时。我将如何拦截对 put(...) 方法的调用。我想检查调用中的参数。

4

5 回答 5

4

您可以使用Aspect Oriented Programming来做到这一点。你只需要声明你想要“窥探”的代码的切入点。简而言之-您可能会声明注释,将它们放在方法签名之上,并且所有带注释的方法都可能在编译时由编译器修改(或在将字节码加载到 jvm 时进行修改),而无需修改其源代码.

AspectJ对此很有用。

于 2012-06-01T09:01:54.330 回答
1

让我重新表述您的问题:每次执行对特定类的非静态方法调用时,您都希望执行自己的代码。我还假设您可以完全访问 JVM 环境。

看看JMX Beans。这些 bean 是 Java 虚拟机行为的接口。

另请查看Java 代理规范,以修改您无权访问 MAIN 方法的现有应用程序。

于 2012-06-01T08:58:21.393 回答
1

你可以试试JMSPY。Jmspy 是一个 java 库,它允许记录 java 方法调用,将数据保存到一个名为快照的文件中,并使用 jmspy 查看器对其进行分析。

于 2014-12-24T15:58:39.287 回答
0

看看AspectJ。它允许您在方法调用中插入钩子,并在方法主体运行之前和之后执行任意代码。它使用自定义类加载器解决了这个问题。

于 2012-06-01T08:56:55.533 回答
0

我建议研究允许分离横切关注点(日志等)的面向方面的编程。

这样,为您的方法指定切入点,您可以“窥探”这些方法。

于 2012-06-01T09:00:01.880 回答