Java向库类添加新函数
问题: 应用程序使用一些库。就像:
ClassA a=new ClassA();
在这个库中,classA 使用 classB - 例如从 classB 调用某些方法。 我需要改变这个方法的工作方式。 不使用AOP可以吗? 谢谢。
The problem:
application uses some library. Like:
ClassA a=new ClassA();
In this library classA uses classB - e.g. call some method from classB.
I need to change how this method works.
Is it possible do without using AOP?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
有两个选项:
a) 修改源
b) 修改字节码
a) 意味着:下载源代码,更改它,构建并使用您自己的版本。缺点:对于库的每个新版本,您都需要创建一个新的修补版本
b) 为此,AOP(可能使用 AspectJ)是最简单的方法。其他选项是使用 commons / bcel 或 cglib。 AOP 更容易,因为您只需要实现您想要的行为,而使用字节码操作,您还必须进行大量基础设施编程(例如,提供运行补丁的自定义类加载器或 Java 代理)。
替代方案 c) 通常是最好的:联系库的开发人员并要求他提供您需要的功能。
There are two options:
a) modify the source
b) modify the byte code
a) means: download the source, change it, build and use your own version. Drawback: for every new version of the library, you'll need to create a new patched version
b) For this, AOP (probably using AspectJ) is the easiest way. Other options would be to do it programmatically using commons / bcel or cglib. AOP is easier because you only have to implement the behaviour you want, whereas using byte code manipulation, you would also have to do lots of infrastructure programming (e.g. providing a custom ClassLoader or Java Agent that runs your patch).
Alternative c) is often the best: contact the developer of the library and ask him to provide the functionality you need.
如果 ClassA 不是最终的,您可以对 ClassA 进行子类化。您可能应该下载该库的源代码并查看其内部结构以了解它是如何工作的——仅创建一个子类作为最后的手段——您不想破坏该库。
You can subclass ClassA if ClassA is not final. You should probably download the source for the library and look at the internals to see how it works -- only create a subclass as a last resort -- you don't want to break the library.