我正在尝试实现方法委派,并且还通过委派所有setter来添加一个字段来跟踪类中的脏字段。我的类实例化看起来像这样:
T t = new ByteBuddy()
.subclass (typeClass)
.defineField ("dirtyFields", List.class, Visibility.PUBLIC)
.method(ElementMatchers.isSetter())
.intercept(MethodDelegation.to(SetterInterceptor.class))
.make ()
.load (SetterInterceptor.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
.getLoaded ()
.newInstance();
List<String> l = new ArrayList<String> ();
t.getClass().getField("dirtyFields").set(t, l);
l.add("foobar");
return t;
我的拦截器看起来像这样:
@RuntimeType
public static Object intercept(@SuperCall Callable<?> superMethod, @Origin Method method, @Super(proxyType = TargetType.class) Object delegate) throws Exception {
System.out.println ("---- Intercept");
markDirty (delegate, Character.toLowerCase (method.getName ().charAt(3)) + method.getName().substring(4));
return superMethod.call();
}
但是,我无法获得调用setter的“Object”,而delegate似乎没有引用该对象。我想知道是否有我需要做的事情,或者我可以注入的东西,以提供这种能力。
谢谢!
答案 0 :(得分:2)
我通过将@This注入拦截器来回答我自己的问题:
public static Object intercept(@This Object thiz, @SuperCall Callable<?> superMethod, @Origin Method method, @Super(proxyType = TargetType.class) Object delegate) throws Exception {