假设您有一个应用程序,该应用程序定义了一个名为A的“实体”(接口),并附带了一个AImpl。并且您具有将A类扩展到B,C,.. Z(带有BImpl,...)的第三方插件,每个插件都添加了一些状态和功能。您的应用程序中还具有一个“工厂”,用于创建A的实例。

我希望我的“用户”同时加载多个插件,例如F,K和W,这样工厂将比创建同时属于F,K和W的“超级A”实例。假设“接口”和“实现”严格分开,只要“超级A”实现F,K和W的接口,就不应该说它既不是FImpl,KImpl也不是WImpl。因此是一种“运行时”多重继承。

确切地说,我没有F,K或W的源代码,并且第三方开发人员不需要了解彼此的扩展。

因此,是否有一些库可以轻松合并Java类?理想情况下,通过某种方式来管理“冲突”,例如,两个类定义了具有相同签名的私有方法,或者试图覆盖相同的基类方法。

注意:我在寻找使用字节码操作而不是合成的东西。组合可防止基类的覆盖方法的“扩展”类占用更多内存。

[编辑]正如我在对@Gray的评论中所解释的那样,出于多种原因,组合不是一个好的解决方案。虽然可以使用它,但是如果正确使用它,最终会遇到很多非常小的类和接口,以及大量的粘合代码,使它们看起来像一个对象。除了会导致生产力降低的大量编码开销外,由于到处都增加了间接寻址,因此您的应用程序使用更多的内存,并且运行速度也慢得多。

对于处理小型和短数据库事务的应用程序,组合可能是完美的,但是对于必须始终将千兆字节的热数据保留在ram中的应用程序(这是我将要做的),这具有非常高的实际成本,两者开发时间,以及客户端和服务器的内存和CPU需求。

可以“自然地”编码的解决方案(接口优先编程风格就是我通常如何编码),但对可以扩展的基类中的方法有一定限制,这比编写“便宜”得多。

最佳答案

虽然它不是一个易于使用的库,但到目前为止,我发现的最接近的是在ASM中执行此“食谱”的方法:

Merging class methods with ASM

但是正如页面上所说,它不能处理极端情况,这就是为什么拥有一个能够做到这一点的库会更容易的原因。

10-06 04:09