我有一个实现接口A
的类I
。我有两个类B
和C
,每个类都扩展A
并添加一个新方法。类B
中的新方法与C
的方法不同。我需要创建一个代理(一种复合),它应该包含A
的所有方法以及B
和C
中的新方法。
我尝试在CGLIB中使用Mixin $ Generator,但我收到错误java.lang.ClassFormatError: Duplicate interface name in class file
。
有人可以建议解决方案吗?
答案 0 :(得分:0)
用Java真正组合两个非接口类是不可能的。如果这两个对象具有共同的结构(通过A
),那么这将导致冲突,因为A
中的任何字段或方法都会加倍,这在Java中是非法的。但是,如果不存在此类冲突信息,则类B
和C
不应共享超类A
。
如果要应用此类mixin委派,则需要为类创建一些接口抽象。然后,可以在代理内部组合这些接口,并将其委托给B
和C
的实例,具体取决于哪些实现接口。这个,仅此而已,由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());
}