如何在Java或Android中拦截对库类的方法调用?

时间:2014-02-07 02:58:12

标签: java android aspectj spring-aop

我有一个单独的库类,并没有实现任何接口(所以我假设我不能使用动态代理)。但是,我需要与动态代理相同的功能。我需要劫持呼叫,记录一些数据并按原样将呼叫传递给库。

是否可以在不使用AspectJ或Spring AOP的情况下执行此操作? (我不确定如何使用这些框架,但如果没有其他方法,我将不得不调查它)。

3 个答案:

答案 0 :(得分:1)

您可以使用相同的名称和包提供自己的同一个类的实现,并尝试首先将其放入类路径中。具有这种类路径的调用代码将首先选择拦截类,并且拦截类可以调用实际包的其他类来提供其实际功能。

最好是使用存档工具从库.jar中删除被覆盖的类。

答案 1 :(得分:0)

您可以更改调用f()的类中的import语句,以便它们看到实现f()的其他类。 类的实现将执行日志记录并调用实际的f()。

仍然需要进行一些编辑,但不能更改每次通话。

顺便说一句:根据项目的大小,您可能需要考虑制作包装内容"黑匣子"无论如何,如果这种要求将继续进行。

答案 2 :(得分:0)

就像我在我的评论包装器中开始从外部库中实现的所有类。然后从您自己的类中调用外部库,这样您就可以登录所需的功能。如果您使用相同的功能名称,则无需更改所调用的内容,只需更改导入即可。大多数IDE提供了大量名称替换,因此它不应该是太大的负担,但是它会很乏味。