我想使用 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()方法@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?

#1楼 票数:0

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

  ask by FlyingSheep translate from so

未解决问题?本站智能推荐:

1回复

使用ByteBuddy的条件方法委托

是否可以在 bytebuddy 的方法委托调用中进行条件调用? 假设我们有以下情况: 我们可以做类似“仅当超级方法调用返回 true 时调用子类方法”之类的事情吗? 那将是一个有条件的“andThen”:
1回复

如何使用ByteBuddy委托拦截bootstrap类方法

我正在使用java agent和bytebuddy拦截FileIOStreams中的“read”和“write”方法。 要实现的功能是“在某些情况下调用原始方法,否则通过”。 因此,我需要使用方法委派来完全控制调用流,而不是使用Advice包装它。 当@Morph不存在时,方法拦截工作正
2回复

绑定字节伙伴方法仅委托给带有注释参数的方法

我想装饰现有对象,以便自动验证方法调用。 我已经设法将方法调用委托给拦截器,该拦截器调用了Hibernate验证程序,到目前为止,它可以正常工作: 我想改进的是仅将方法调用绑定到至少具有一个带有约束注释的参数的方法,例如: 我如何在Byte Buddy中指定ElementMatcher
1回复

在另一个包中委托接口的方法时,如何使委托类非公开?

在我的库中,我正在生成客户端提供的接口的实现(使用库中的自定义指令进行注释)。 我使用MethodDelegation拦截接口方法并将它们转发到库包中定义的委托类的实例: 这有效,但它将ImplDelegate作为库中的公共类型公开; 我宁愿让它保持包私有。 这样做的一种方法是在运行时在库包中生成I
1回复

用ByteBuddy定义一个方法、调用和拦截器并委托给目标?

我有一个具有多种方法的对象service ,其中一种方法是foo(arg1, arg2) 。 想要创建一个新的包装类: 有一个方法_foo和一个额外的参数 将_foo执行委托给拦截器,返回被忽略 最后,委托对service目标foo调用。 不知何故,我没有这样做:final List<Cla
2回复

字段上的方法委托并在Bytebuddy中进行转换

使用 Bytebuddy 假设如下: 一般我们调用Handler的handle()方法,但在某些情况下,我们需要在运行时调用ConcreteHandler类的handle2()。 现在的问题是:使用 Bytebuddy 可以吗? 可能是的,但如何? 我试过: ...但它因 IllegalState
1回复

使用@Super在bytebuddy中委托私有方法-可能吗?

我试图在 bytebuddy 中委托一个私有方法 - 但我如何调用“覆盖”版本? 如果我有 和 和 就编译器而言,即使@Super Foo foo将在运行时变成其他东西,我也不允许在 Foo 上调用私有方法。 我似乎也无法反映/调用getNum() - 无论@Super Foo变成什么,它似乎都没有
1回复

字节伙伴将实例方法委托给静态方法,将实例作为参数传递

我想知道是否使用字节伙伴我可以在课堂上创建方法 以便它会调用 我努力了 并加入@This在参数FooPrinter但我接收例外的是,在方法的非FooPrinter允许delegatrion从Foo.bar()