我想使用Byte-Buddy生成一个将接口方法委托给从超类继承的方法的类。
下面的两个代码段执行此操作:
Class<? extends Object> clazz = new ByteBuddy()
.subclass(serviceSuperClass)
.name(className)
.implement(serviceInterface)
.defineField(generalInterceptor, GrandFatherProxy.class, Visibility.PUBLIC)
.method(isDeclaredBy(serviceInterface))
.intercept(MethodDelegation.toField(generalInterceptor))
.make ()
.load(classLoader)
.getLoaded();
在这种情况下,GrandFatherProxy.class是给定serviceSuperClass的超类,因此属于clazz。
一旦我使用了Reflection生成了clazz的实例,我就可以使用该实例设置字段generalInterceptor:
Field field = instance.getClass().getDeclaredField(generalInterceptor);
field.setAccessible(true);
field.set(instance, instance); // set field on instance to contain instance!
[这有效:Clazz现在委托给self:所有接口方法都被clazz继承自GrandFatherProxy.class的@RuntimeType intercept()
方法拦截。
但是,如果我可以明确指示Byte-Buddy进行自我委托,那将更加优雅。
例如类似于:
Class<? extends Object> clazz = new ByteBuddy()
.subclass(serviceSuperClass)
.name(className)
.implement(serviceInterface)
.method(isDeclaredBy(serviceInterface))
.intercept(MethodDelegation.toSelf())
.make ()
.load(classLoader)
.getLoaded();
toSelf()
是我的伪代码,用于指示Byte-Buddy生成的类应委托给它自己。
我是否错过了一种方法?还是需要更改Byte-Buddy?
您可以通过定义返回this
的私有方法然后在此方法上使用MethodDelegation.toMethodReturnOf
来解决问题。要添加此功能,需要对库进行更改。