我想使用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的超类。
一旦我使用反射生成了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?
发布于 2020-02-23 03:35:30
您可以通过定义一个返回this的私有方法,然后在此方法上使用MethodDelegation.toMethodReturnOf来绕过它。要添加此功能,需要对库进行更改。
https://stackoverflow.com/questions/60336528
复制相似问题