java - 方法委托给自己
问题描述
我想使用 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 进行更改?
解决方案
你可以通过定义一个返回的私有方法来欺骗你的方法,this
然后MethodDelegation.toMethodReturnOf
在这个方法上使用。要添加此功能,需要对库进行更改。
推荐阅读
- amazon-web-services - 无法跨账户使用 Lambda 将 ACM 公共证书附加到 ALB 侦听器
- java - 使用java8将列表转换为地图
- python-3.x - 从 keras 到 pytorch 的自定义层
- electron - Electron:如何获取 webContents(检查 backgroundThrottling)?
- amazon-web-services - 使用无服务器框架将 AWS WAF 与 API 网关相关联
- javascript - 旋转轮在 Html 和 JS 中添加组件
- javascript - 自动格式化在 Eclipse 的 php 文件中嵌入 JavaScript
- cdi - Quarkus 和 JDBI 集成:类型 javax.sql.DataSource 和限定符 [@Default] 的不满足依赖性
- javascript - 加载资源失败:服务器响应状态为 404 (Not Found) failed to resolve error
- jquery - 绑定并验证具有 IList 的模型的输入