首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将方法委托给自己

将方法委托给自己
EN

Stack Overflow用户
提问于 2020-02-21 18:19:27
回答 1查看 70关注 0票数 0

我想使用Byte-Buddy生成一个类,将接口方法委托给从超类继承的方法。

下面的两个代码片段可以做到这一点:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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进行自我委托,那就更好了。

例如,像这样:

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

发布于 2020-02-23 03:35:30

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60336528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档