gpt4 book ai didi

java - 如何使用代码生成跟踪 POJO 的状态

转载 作者:行者123 更新时间:2023-12-01 21:44:31 25 4
gpt4 key购买 nike

我们正在寻找一种解决方案来以高性能的方式跟踪客户端 POJO 实例的状态。我们期望的是:每次对 POJO 进行更改时,都会使用 setter 来创建此状态。我们创建了一个基于 OGNL 的监视/事件总线,当发生更改时,我们将发送适当的 OgnlChangeEvent 到我们的事件总线。

到目前为止,我们研究了 AspectJ/cglib/对象图 Diff 解决方案,但它们都占用了太多的 CPU 时间。我们当前的解决方案基于 Spring MethodInterceptor,每次调用 Getter 方法时我们都会创建一个新的 Proxy 实例。

此时,我们开始研究代码生成解决方案,我们偶然发现了 Byte Buddy。这个方向是正确的做法吗?我们可以生成一个新的类来扩展我们的客户端 POJO 状态并通知其 OGNL 前缀,直到调用 setter 方法吗?

最佳答案

Byte Buddy是一个代码生成工具,当然可以实现这样的解决方案。要创建拦截 setter 的类,您可以编写如下代码:

new ByteBuddy()
.subclass(UserPojo.class)
.method(ElementMatchers.isSetter())
.intercept(MethodDelegation.to(MyInterceptor.class)
.andThen(SuperMethodCall.INSTANCE)
.make();

在哪里编写这样的拦截器:

public class MyInterceptor {
public static void intercept(Object value) {
// business logic comes here
}
}

这样,您可以在每次调用 setter 时添加一些代码,这些代码在原始代码之前触发。您还可以使用所有基元类型重载拦截方法,以避免参数装箱。 Byte Buddy 会为您找出解决办法。

但是我很困惑你所说的“表现出色”是什么意思。对我来说,上面的代码与创建一个类相同:

class UserClass {
String value;
void setValue(String value) {
this.value = value;
}
}

class InstrumentedUserClass extends UserClass {
@Override
void setValue(String value) {
MyInterceptor.intercept(value);
super.setValue(value);
}
}

性能主要取决于您在 intercept 方法中执行的操作的性能。

最后,我不明白为什么 cglib 不适合你,但是使用 Spring(构建在 cglib 之上)却可以工作。我怀疑您的拦截逻辑存在问题,您应该调查一下。

关于java - 如何使用代码生成跟踪 POJO 的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36104124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com