首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用cglib实现委托?

如何使用cglib实现委托?
EN

Stack Overflow用户
提问于 2014-08-12 10:45:07
回答 1查看 624关注 0票数 0

这里,我需要创建一个BImpl实例,但是BImpl需要通过接口A访问功能。为此,类实现了这个接口A。如何在运行时连接BImpl的这些接口方法的委托?其思想是BImpl可以使用A的方法。

在我的例子中,A是已知的,AImpl实例是在运行时创建的。

代码语言:javascript
复制
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);
    }
  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-12 18:56:12

你所描述的听起来像是一个混合模式。你不能简单地明确地执行一个授权吗?类似于:

代码语言:javascript
复制
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传递一个不同的实例:

代码语言:javascript
复制
return method.invoke(obj, args);

否则,您将再次调用被截获的方法,并通过在循环中单击MyMethodInterceptor,发现自己处于一个无休止的循环中。你也可以相反,

如果您不一定要使用cglib,您还可以查看我的库字节巴迪,它使这一切更具表现力:

代码语言:javascript
复制
new ByteBuddy()
  .subclass(BImpl.class)
  .method(isAnnotatedBy(A.class))
  .intercept(Forwarding.to("a", A.class))
  .make();

生成的类现在有一个字段a,您可以将其设置为任何A的实例,现在将A接口方法的方法调用委托给该实例。例如,您可以通过使用Java反射来设置此字段。否则,可以通过以下方式使用static字段

代码语言:javascript
复制
Forwarding.to(new A() {
  // A methods
}); 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25262321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档