java - 如何*在运行时*合并多个 Java 类?

标签 java

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

我希望我的“用户”同时加载多个插件,比如 F、K 和 W,这样工厂就会创建一个同时是 F、K 的“ super A”实例和W。假设“接口(interface)”和“实现”是严格分开的,只要“ super A”实现了F、K和W的接口(interface),那么它既不是FImpl、KImpl也不是WImpl应该无关紧要。所以是一种“运行时”多重继承。

准确的说,我不会有F、K、W的源码,第三方开发者应该不需要知道彼此的扩展。

那么,是否有一些库可以轻松合并 Java 类?理想情况下,使用某种管理“冲突”的方法,例如,两个类定义具有相同签名的私有(private)方法,或者试图重写相同的基类方法。

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

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

对于处理小而短的 DB 事务的应用程序,组合可能是完美的,但对于必须始终在 ram 中保存千兆字节热数据的应用程序,这就是我将要做的,这有一个非常真实的成本,包括开发时间以及客户端和服务器的内存和 CPU 要求。

一个你可以“自然”编码的解决方案(接口(interface)优先的编程风格是我通常的编码方式),对你可以扩展的基类的哪些方法有一些限制,会比组合“便宜”得多.

最佳答案

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

Merging class methods with ASM

但正如页面所说,它不处理极端情况,这就是为什么有一个库来处理它会更容易。

关于java - 如何*在运行时*合并多个 Java 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8189037/

相关文章:

java - 有条件更新交易中的值

java - 有没有办法在基于注解的 MyBatis/iBatis 中重用 SQL 片段?

java - 为什么java的Regex有时会抛出stackoverflow异常?

java - android处理程序将变量设置为final

java - JSONP、Java Servlet 和 Internet Explorer

java - 验证实例与 Weka 分类器的兼容性

java - 计算多边形顶点的外角

java - Android - Activity 行为?

java - Spring MVC 无法处理来自资源处理程序的 404?

java - 如何在 Avro 中序列化 java.math.BigDecimal?