如何创建一个可以组成多个类的方法的代理?

时间:2014-01-25 23:21:13

标签: java proxy cglib object-composition

我有一个实现接口A的类I。我有两个类BC,每个类都扩展A并添加一个新方法。类B中的新方法与C的方法不同。我需要创建一个代理(一种复合),它应该包含A的所有方法以及BC中的新方法。

我尝试在CGLIB中使用Mixin $ Generator,但我收到错误java.lang.ClassFormatError: Duplicate interface name in class file

有人可以建议解决方案吗?

1 个答案:

答案 0 :(得分:0)

用Java真正组合两个非接口类是不可能的。如果这两个对象具有共同的结构(通过A),那么这将导致冲突,因为A中的任何字段或方法都会加倍,这在Java中是非法的。但是,如果不存在此类冲突信息,则类BC不应共享超类A

如果要应用此类mixin委派,则需要为类创建一些接口抽象。然后,可以在代理内部组合这些接口,并将其委托给BC的实例,具体取决于哪些实现接口。这个,仅此而已,由cglib的Mixin提供。以下是cglib组合的工作原理示例:

public interface Interface1 {
  String first();
}

public interface Interface2 {
  String second();
}

public class Class1 implements Interface1 {
  @Override
  public String first() {
    return "first";
  }
}

public class Class2 implements Interface2 {
  @Override
  public String second() {
    return "second";
  }
}

public interface MixinInterface extends Interface1, Interface2 { /* empty */ }

@Test
public void testMixin() throws Exception {
  Mixin mixin = Mixin.create(new Class[]{Interface1.class, Interface2.class,
      MixinInterface.class}, new Object[]{new Class1(), new Class2()});
  MixinInterface mixinDelegate = (MixinInterface) mixin;
  assertEquals("first", mixinDelegate.first());
  assertEquals("second", mixinDelegate.second());
}