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 弄清楚该为您做什么。
但是,我对您所说的performant感到困惑。上面的代码对我来说与创建一个类相同:
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 之上)确实有效。我怀疑你的拦截逻辑有问题,你应该调查一下。