byte-buddy - 如何拦截现有类的方法并使用字节伙伴将所有调用委托给接口的不同实现
问题描述
我是 byte-buddy 的新手,我正在尝试使用它在我的项目中构建解决方案。对于特定场景,我不知道如何实施该解决方案。
我有 2 个接口的实现(或父类的子类)
基于一个条件,我想将所有 Class1 方法调用委托给 Class2。
例子 :
public class Class1 implements SampleInterface{
public Map<String,String> operation1(List<String> var){
}
public void operation2(List<String> var){}
public void operation3(){
System.out.println("Class1 : Operation 3");
}
}
public class Class2 implements SampleInterface{
public Map<String,String> operation1(List<String> var){
}
public void operation2(List<String> var){}
public void operation3(){
System.out.println("Class1 : Operation 3");
}
}
我想使用 byte-buddy 重新定义 Class1,如下所示。我想将 Class2 的实例注入 Class1。条件子句需要放在每个方法中。
有人可以帮忙解答吗?
public class Class1 implements SampleInterface{
Class2 proxyInstance;
public Map<String,String> operation1(List<String> var){
if(condition==true){
return proxyInstance.operation1(var);
}else{
//Class1 implementation
}
}
public void operation2(List<String> var){
if(condition==true){
return proxyInstance.operation2(var);
}else{
//Class1 implementation
}
}
public void operation3(){
if(condition==true){
proxyInstance.operation3();
}else{
System.out.println("Class1 : Operation 3");
}
}
}
解决方案
使用 Byte Buddy,您应该可以使用MethodDelegation
它。您可以通过声明参数@Origin Method m
和参数来获取原始方法@AllArguments Object[] args
。然后,您可以使用它来调用委托实例上的方法或调度您的自定义逻辑。
推荐阅读
- go - Golang bytes.Buffer - 传递值问题
- oracle - 想要对数据进行四舍五入
- php - 调用数组错误上的成员函数
- json - ResponseSerialization.swift 崩溃(部分申请专业)
- laravel - 如何在 laravel 中搜索内置方法?
- python - 根据特定的布尔条件选择 Numpy 数组中的一些元素
- xml - XQuery 中序列的乘积
- css - React-Bootstrap:将面板宽度设置为 Panel.Collapse 宽度
- android - 在实现谷歌材料设计库时出现错误,因为程序类型已经存在
- go - 以裸返回返回的通道为 nil