首页 > 解决方案 > 方法委托给自己

问题描述

我想使用 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:所有接口方法都被@RuntimeType intercept()从 GrandFatherProxy.class 继承的 clazz 方法拦截。

但是,如果我可以明确指示 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 进行更改?

标签: javabyte-buddy

解决方案


你可以通过定义一个返回的私有方法来欺骗你的方法,this然后MethodDelegation.toMethodReturnOf在这个方法上使用。要添加此功能,需要对库进行更改。


推荐阅读