gpt4 book ai didi

java - 方法委托(delegate)给自身

转载 作者:行者123 更新时间:2023-12-01 18:17:39 24 4
gpt4 key购买 nike

我想使用 Byte-Buddy 生成一个类,该类将接口(interface)方法委托(delegate)给从父类(super class)继承的方法。

下面的两个代码片段执行此操作:

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 的父类(super class),因此也是 clazz 的父类(super class)。

一旦我使用 Reflection 生成了 clazz 的实例,我就可以使用该实例设置字段generalInterceptor:

Field field = instance.getClass().getDeclaredField(generalInterceptor);
field.setAccessible(true);
field.set(instance, instance); // set field on instance to contain instance!

这有效:Clazz 现在委托(delegate)给 self:所有接口(interface)方法都由 clazz 继承自 GrandFatherProxy.class 的 @RuntimeType Intercept() 方法拦截。

但是,如果我可以明确指示 Byte-Buddy 进行 self 委托(delegate),那就更优雅了。

例如像这样:

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 生成的类应委托(delegate)给自身。

我是否错过了执行此操作的方法?或者是否需要对 Byte-Buddy 进行更改?

最佳答案

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

关于java - 方法委托(delegate)给自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60336528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com