【发布时间】:2014-02-21 15:17:01
【问题描述】:
我有实现接口“I”的“A”类。我有两个类“B”和“C”,每个类都扩展了 A 并添加了一个新方法。 C和B不覆盖A中的任何方法。“B”类中的新方法与“C”的签名不同,新方法是C和B之间的唯一区别。我需要创建一个代理(排序'B' 和 'C' 的对象的组合)应该具有 A 的所有方法以及 'B' 和 'C' 中的新方法。
我尝试在 CGLIB 中使用 Mixin$Generator 创建复合代理,但出现错误“java.lang.ClassFormatError: Duplicate interface name in class file”。
有没有人遇到过类似的情况?有什么解决这个问题的建议吗?
感谢您的宝贵时间。
这里是用接口和所有类更新的代码。
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Mixin;
import net.sf.cglib.proxy.Mixin.Generator;
interface I {
public boolean testSomething();
}
class A implements I {
@Override
public boolean testSomething() {
boolean isRoot = true;
System.out.println("Returning '" + isRoot + "' from '" + this + "' ...");
return isRoot;
}
}
class B extends A {
public boolean isB() {
boolean isRoot1 = true;
System.out.println("Returning " + isRoot1 + " from : " + this);
return isRoot1;
}
}
class C extends A {
public int getInt() {
int someInt = 2;
System.out.println("Returning " + someInt + " from : " + this);
return someInt;
}
}
public class TestMixin {
public static Object invokeMethod(Object target, String methodName)
throws Exception {
Method method = target.getClass().getMethod(methodName);
return method.invoke(target);
}
public static Mixin newInstance(Object[] delegates) {
return newInstance(null, delegates);
}
public static Mixin newInstance(Class[] interfaces, Object[] delegates) {
Generator gen = new Generator();
gen.setStyle(Mixin.STYLE_EVERYTHING);
if(interfaces != null) {
gen.setClasses(interfaces);
}
gen.setDelegates(delegates);
return gen.create();
}
public static void main(String[] args) throws Exception {
// B and C extend Class 'A' which implements 'I' interface
B root1 = new B();
C root2 = new C();
A[] roots = { root1, root2 };
Class<?>[] interfaces = new Class[] { B.class, C.class };
// newInstance causes java.lang.ClassFormatError: Duplicate interface
// name in class file com/mycom/cglib/B$$MixinByCGLIB$$831a43ec
Mixin mixin = TestMixin.newInstance(interfaces, roots);
System.out.println("Mixin Object: " + mixin);
System.out.println(invokeMethod(mixin, "testSomething"));
System.out.println(invokeMethod(mixin, "isB"));
System.out.println(invokeMethod(mixin, "getInt"));
}
}
【问题讨论】:
-
发布你用来生成代理的代码。
-
@John 那篇文章没有回答我的问题。这篇文章讨论了如何使用接口实现/模拟多重继承。我的问题是如何动态创建一个代理类,它可以从同一个父类的两个不同子类继承方法。我不想编写任何代码来使用组合来实现。
-
root1和root2是什么?您上面的代码无法编译。 -
我已经用 root1 和 root2 更新了代码。
标签: java proxy composite cglib