首页 > 解决方案 > 如何拦截现有类的方法并使用字节伙伴将所有调用委托给接口的不同实现

问题描述

我是 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

解决方案


使用 Byte Buddy,您应该可以使用MethodDelegation它。您可以通过声明参数@Origin Method m和参数来获取原始方法@AllArguments Object[] args。然后,您可以使用它来调用委托实例上的方法或调度您的自定义逻辑。


推荐阅读