这里,我需要创建一个BImpl实例,但是BImpl需要通过接口A访问功能。为此,类实现了这个接口A。如何在运行时连接BImpl的这些接口方法的委托?其思想是BImpl可以使用A的方法。
在我的例子中,A是已知的,AImpl实例是在运行时创建的。
public static void main(String[] args) {
B b = (B) Enhancer.create(BImpl.class, new MyInterceptor());
System.out.println(b.cellValue());
}
interface A {
String value();
}
class AImpl implements A {
@Override
public String value() {
return "MyA";
}
}
interface B {
String cellValue();
}
abstract class BImpl implements B, A {
@Override
public String cellValue() {
return value() + "MyBCell";
}
}
class MyInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println(method.getName());
if ("value".equals(method.getName()))
return method.invoke(obj, args);
else
return proxy.invokeSuper(obj, args);
}
}发布于 2014-08-12 18:56:12
你所描述的听起来像是一个混合模式。你不能简单地明确地执行一个授权吗?类似于:
class BImpl implements B, A {
private A a;
public BImpl(A a) {
this.a = a;
}
@Override
public String cellValue() {
return value() + "MyBCell";
}
@Override
public String value() {
return a.value();
}
}这应该是可能的,因为您说您在编译期间知道A。
否则,如果您确实需要在运行时执行此操作,那么对于cglib来说,您的方法可能是正确的。但是,在调用时,需要为obj传递一个不同的实例:
return method.invoke(obj, args);否则,您将再次调用被截获的方法,并通过在循环中单击MyMethodInterceptor,发现自己处于一个无休止的循环中。你也可以相反,。
如果您不一定要使用cglib,您还可以查看我的库字节巴迪,它使这一切更具表现力:
new ByteBuddy()
.subclass(BImpl.class)
.method(isAnnotatedBy(A.class))
.intercept(Forwarding.to("a", A.class))
.make();生成的类现在有一个字段a,您可以将其设置为任何A的实例,现在将A接口方法的方法调用委托给该实例。例如,您可以通过使用Java反射来设置此字段。否则,可以通过以下方式使用static字段
Forwarding.to(new A() {
// A methods
}); https://stackoverflow.com/questions/25262321
复制相似问题