使用字节伙伴

时间:2017-09-28 14:33:02

标签: java jvm byte-buddy

我正在尝试使用Byte Buddy创建代理对象。我实际上想要模拟任何类中的任何依赖项,如果在该依赖对象上调用任何方法,它将向调用者返回一个每个确定的值。

public class Person{
 private String name;
 private Address address;

 public Person(String name, Address address){
     this.name = name;
     this.address = address;
 }
 public String getAddress(){
  return (address == null) "" : address.getStreet();
 }
}

=============================================== ========================

public class Address {
  private String street;
  public String getStreet() { return street; }

在上面的例子中,我想模拟Address in Person类以及调用person.getAddress()方法。我想根据返回类型动态返回一个值。 我是Byte Buddy的新手。我能够创建一个子类但不知道如何获取方法的动态返回类型并返回我的确定值。

1 个答案:

答案 0 :(得分:0)

您是否有机会将提供的值注入构造函数?在这种情况下,您只需为Address创建一个子类:

Address address = new ByteBuddy()
  .subclass(Address.class)
  .method(any()).intercept(MethodDelegation.to(MyInterceptor.class))
  .make()
  .load(Address.class.getClassLoader())
  .getLoaded()
  .newInstance();

代表类似于:

public class MyInterceptor {
  @RuntimeType
  public static Object intercept(@Origin Method method) {
    // create some return value or null for void
  }
}

只需将此对象提供给构造函数。