间谍Java类方法调用

时间:2012-06-01 08:48:40

标签: java

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

编辑: 例如java.util.HashMap。这个类的源代码不可用 - 至少对我而言,在Oracle的JDK下运行时并非如此。我如何拦截对put(...)方法的调用。我想检查一下调用中的参数。

5 个答案:

答案 0 :(得分:4)

您可以使用Aspect Oriented Programming执行此操作。 你只需要声明你的代码的切入点,你想要'间谍'。简而言之 - 您可以声明注释,将它们放在方法签名之上,并且所有带注释的方法可能在编译时由编译器修改(或在将字节码加载到jvm时进行修改),而无需修改其源代码

AspectJ对此非常有用。

答案 1 :(得分:1)

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

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

另请参阅Java Agent规范,以修改您无权访问MAIN方法的现有应用程序。

答案 2 :(得分:1)

您可以尝试JMSPY。 Jmspy是一个java库,允许记录java方法调用,将数据保存到名为snapshot的文件中,并使用jmspy viewer对其进行分析。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我建议研究aspect oriented programming,它允许分离横切关注点(记录等)。

这样,为方法指定切入点可能会“窥探”方法。