【问题标题】:Find out if an object is already a ByteBuddy proxy查明对象是否已经是 ByteBuddy 代理
【发布时间】:2018-01-18 12:00:44
【问题描述】:

我正在实现 DDD 存储库模式(使用对象数据库,但这对问题并不重要)并且在存储库中有这样的方法:

Entity save(Entity entity);

Entity 是一个接口。

在实现中,我创建了一个代理,包装接收到的实体并覆盖 getter 和 setter(然后写入文档),然后返回它。

关键是只有在实体尚未代理时才必须创建此代理,但由于 ByteBuddy 代理不依赖于任何 ByteBuddy 类,我不知道如何确定实体是否已被代理.

了解对象是否已被 ByteBuddy 代理的最佳机制是什么?

【问题讨论】:

    标签: java byte-buddy dynamic-proxy


    【解决方案1】:

    您是自己创建实例还是您正在使用的库?我建议您为任何此类实例实现一些标记接口,然后您可以执行快速且廉价的检查:instance instanceof MyProxy

    Byte Buddy 不公开任何属性是库的重要组成部分。例如,如果存在这样的依赖关系,您就不能在 OSGi 环境中使用该库。

    【讨论】:

    • 我手动完成所有操作。标记很好,但是我在 ByteBuddy API 中没有看到如何提供两个类来为代理扩展(即真正的类加上标记接口)。此外,javadoc 声明类没有被缓存,这在我的场景中很有用。有没有这方面的例子?
    • 我想我已经理解了缓存的东西,Proxy 类只需创建一次,然后根据需要实例化多次。但是,所有代理共享相同的拦截器实例,我需要每个代理都有一个(因为文档参考在那里)。我需要考虑更多。
    • 您可以通过typeBuilder.implement(...)向一个类型添加任意数量的接口。对于缓存,请查看TypeCache。为了使您的代理类无状态,而是将状态捆绑在一个单独的实例中,并向您的类添加一个字段,您可以从您的委托中读取该字段。您可以使用包含 setter 的界面来设置此字段,您也可以将其用作标记界面。
    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2017-08-10
    • 2012-09-26
    • 1970-01-01
    相关资源
    最近更新 更多