Java中的自动委派

时间:2012-11-12 17:13:47

标签: java delegates

我想为将在运行时生成的对象添加一些功能。但是,此对象的界面非常大(并且不受我的控制)。我想将对象包装在我自己的类中,它添加了我想要的功能并将标准接口功能委托给原始对象 - 有没有办法在Java中执行此操作而不为每个创建一行复制粘贴委托方法界面中的方法?

我想避免的事情:

class MyFoo implements Foo {
  Foo wrapped;

  void myMethod() { ... }

  void interfaceMethod1() wrapped.interfaceMethod1();
  int interfaceMethod2() wrapped.interfaceMethod2();
  // etc etc ...
}

我更喜欢的是:

class MyFoo implements Foo {
  Foo wrapped;

  void myMethod() { ... }

  // automatically delegate undefined methods to wrapped object
}

1 个答案:

答案 0 :(得分:11)

听起来你需要一个dynamic proxy并且只拦截你想要覆盖的方法。

  

动态代理类是实现接口列表的类   在运行时指定,以便通过其中一个方法调用   将对类的实例上的接口进行编码和分派   通过统一的界面到另一个对象。因此,一个动态代理   class可用于为列表创建类型安全的代理对象   接口,无需预先生成代理类,例如   与编译时工具一样。 对一个实例的方法调用   动态代理类被调度到一个方法中   实例的调用处理程序,它们用a编码   标识方法的java.lang.reflect.Method对象   调用和包含参数

的Object类型的数组

(我的重点)

通过实现InvocationHandler,您只需创建一个接收该对象上每次调用的方法(实际上您已经描述过)