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

如何在Java或Android中拦截对库类的方法调用?,java,android,aspectj,spring-aop,Java,Android,Aspectj,Spring Aop,我有一个库类,它是单例的,不实现任何接口(所以我假设我不能使用动态代理)。但是,我需要与动态代理相同的功能。我需要劫持呼叫,记录一些数据,并按原样将呼叫传递给图书馆 不必使用AspectJ或SpringAOP就可以做到这一点吗?(我不知道如何使用这些框架,但如果没有其他方法,我将不得不研究它) 您可以更改调用f()的类中的import语句,以便它们看到实现f()的不同类。该类的实现将进行日志记录并调用真正的f() 仍然需要一些编辑,但不需要更改每个调用 BTW:根据项目的大小,如果这种类型的需

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


不必使用AspectJ或SpringAOP就可以做到这一点吗?(我不知道如何使用这些框架,但如果没有其他方法,我将不得不研究它)

您可以更改调用f()的类中的import语句,以便它们看到实现f()的不同类。该类的实现将进行日志记录并调用真正的f()

仍然需要一些编辑,但不需要更改每个调用


BTW:根据项目的大小,如果这种类型的需求将继续进行,您可能会考虑将包装打包成“黑匣子”。

< P>您可以提供同一个类的相同名称和包的实现,并尝试将其放入类路径中。具有此类类路径的调用代码将首先选择拦截类,而拦截类可以调用实际包的其他类以提供其实际功能


最好是使用归档工具从library.jar中删除被重写的类。

就像我在注释包装中开始的那样,从外部库中实现的所有类。然后从您自己的类中调用外部库,这样您就可以登录所需的函数。如果使用相同的函数名,则不必更改调用的名称,只需更改导入即可。大多数IDE都提供了mass name replace,所以它不应该是一个太大的负担,但是它会很单调。

此外,我没有访问该库的源代码的权限。这是一个黑匣子。我不知道你到底想做什么,但是如果你想做,但是如果你知道你给库做的类,并且你在传递数据,为什么不做你自己的单例,它是一个包装器,在内部称你为包装器类库类?对不起,如果我不是很清楚的话。我有一个应用程序,它可以对属于类a的方法f()进行数百次调用(该类是单例,其代码我无法更改)。我希望在转发调用之前拦截对f()的每个调用并记录数据。如果我做了一个包装器,我需要去我的应用程序中的每个位置并更改代码?B.f()调用super.f()?这门课是期末考试吗?是的,A是期末考试。对不起,我没提那件事。