委托给自己的方法

问题描述 投票:0回答:1

我想使用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?

java byte-buddy
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.