Byte Buddy是一个代码生成工具,它当然可以实现这样的解决方案。为了创建一个截取一个二传手的一类,你会写这样的代码:
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
}
}
这样一来,每次都可以添加一些代码二传手在原始代码之前被触发。您还可以使用所有基元类型重载拦截方法,以避免对参数进行装箱。 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之上 - 是行得通的。我怀疑你应该研究一下你的拦截逻辑有一些问题。
你能详细说明一些测量的性能问题吗?您调用方法的次数,没有更改跟踪的方法执行时间是多少,更改跟踪的执行时间是多少,以及您在代码的更改跟踪部分中执行的操作的概述? –
我同意@NándorElődFekete。很难相信AspectJ应该比Spring AOP慢。如果是这样,你必须做一些错误的事情,因为AspectJ非常高效。如果我们看到你的方面,也许我们可以帮助。但是如果你对ByteBuddy感到满意,也许这个评论已经过时了。我最近在这里没有读过很多东西,因为我很忙,所以我在这里评论有点迟,也许。 – kriegaex