6

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

我想避免的:

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
}
4

1 回答 1

11

听起来您需要一个动态代理并仅拦截您想要覆盖的方法。

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

(我的重点)

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

于 2012-11-12T17:15:09.443 回答