作者:米饭2502912051 | 来源:互联网 | 2023-02-12 17:21
在撰写本文时的Byte Buddy教程中,所有内容都得到了解释,但是一个简单的after和before方法拦截器不存在,正如我在下面解释的那样,我错过了什么或者教程很复杂.(请参阅LoggerInterceptor示例给出方法但不是对象,ChangingLoggerInterceptor示例给出对象但不调用方法)
我想要实现的是在setter方法执行后调用对象的方法.如何编写拦截器并在Java 6中使用它?
public class DirtyClass{
private String _sField;
private boolean _bDirty;
public void setField(String sField) {
_sField = sField;
//setDirty(true); to be appended after proxying
}
public String getField() {
return _sField;
}
public void setDirty(boolean bDirty){
_bDirty = bDirty;
}
public boolean isDirty(){
return _bDirty;
}
}
DirtyClass d = new ByteBuddy().subclass(DirtyClass.class)...???
d.setField("dirty now");
System.out.println(d.isDirty()); //Expecting true
Rafael Winte..
9
即使没有方法委派,您也可以实现这样的机制,如下所示:
DirtyClass d = new ByteBuddy()
.subclass(DirtyClass.class)
.method(isSetter().and(not(named("setDirty"))))
.intercept(SuperMethodCall.INSTANCE.andThen(
MethodCall.invoke(DirtyClass.class.getMethod("setDirty", boolean.class))
.with(true)
)).make()
.load(DirtyClass.class.getClassLoader())
.getLoaded()
.newInstance();
这样,每个setter都被重写,首先调用它的super方法,然后以参数的形式调用该setDirty
方法true
.但是,评论中的链接示例也应该起作用.
拦截器可能如下所示(假设某些接口Dirtiable
已实现):
public class Interceptor {
public static void getter(@SuperCall Runnable zuper, @This Dirtiable self) {
zuper.run();
self.setDirty(true);
}
}
这假设已检测的超类实现了Dirtiable
可以使用.implement(Dirtiable.class)
可以实现该方法的地方来完成的接口,以使用该实现来设置字段FieldAccessor
.
1> Rafael Winte..:
即使没有方法委派,您也可以实现这样的机制,如下所示:
DirtyClass d = new ByteBuddy()
.subclass(DirtyClass.class)
.method(isSetter().and(not(named("setDirty"))))
.intercept(SuperMethodCall.INSTANCE.andThen(
MethodCall.invoke(DirtyClass.class.getMethod("setDirty", boolean.class))
.with(true)
)).make()
.load(DirtyClass.class.getClassLoader())
.getLoaded()
.newInstance();
这样,每个setter都被重写,首先调用它的super方法,然后以参数的形式调用该setDirty
方法true
.但是,评论中的链接示例也应该起作用.
拦截器可能如下所示(假设某些接口Dirtiable
已实现):
public class Interceptor {
public static void getter(@SuperCall Runnable zuper, @This Dirtiable self) {
zuper.run();
self.setDirty(true);
}
}
这假设已检测的超类实现了Dirtiable
可以使用.implement(Dirtiable.class)
可以实现该方法的地方来完成的接口,以使用该实现来设置字段FieldAccessor
.