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