【问题标题】:Override equals on a cglib proxy在 cglib 代理上覆盖等于
【发布时间】:2019-08-14 16:10:03
【问题描述】:

我想使用 CGLIB 代理将我自己的可重用 equals() 方法添加到现有对象。

对象不一定实现任何接口,我需要能够将代理对象转换为原始类(无需获取代理的目标)。

不幸的是,CGLIB 似乎实现了自己的 equals() 方法并确保只调用该方法:有一个私有静态类 (EqualsInterceptor),其方法 intercept() 实现了比较代理对象的合理逻辑。 问题是,这个方法最终将比较委托给目标对象:我需要重用一些目标类未实现的逻辑。

使用标准代理,我能够拦截对 equals() 方法的调用并执行我的逻辑。问题是这些代理不能转换为原始类。

看来唯一的办法就是重写CGLIB库中的一些类。这似乎不是一个好主意。

【问题讨论】:

    标签: java proxy equals cglib


    【解决方案1】:

    不,使用 cglib 是不可能的。

    您可以使用另一个库,例如 Byte Buddy,它允许您像任何其他方法一样拦截 equals/hashCode

    供披露:我是 Byte Buddy 的作者和 cglib 的维护者,两者均获得 Apache 2.0 许可。

    【讨论】:

    • 鉴于您是 CGLIB 的维护者,我想知道您能否告诉我为什么 CGLIB 很难修改 equals 和 hashCode 方法。似乎是故意的,但我真的不明白这一点。
    • 我是动态创建代理,所以用 Byte Buddy 替换 CGLIB 并不难,但是在开始完全重构之前,你能告诉我 Byte Buddy 的局限性是什么吗?到CGLIB?当然,前提是这个答案不太复杂。
    • cglib 已经有一段时间了,在过去的几年里,我只帮助维护它至少以支持遗留应用程序。这是一年前为了支持集合/地图中的代理而做出的决定。 Byte Buddy 是一个成熟的字节码生成器和操纵器。在 cglib 中没有什么是 Byte Buddy 不能做的,但与 cglib 相比,它的学习曲线稍微陡峭。
    猜你喜欢
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    相关资源
    最近更新 更多