【问题标题】:Automated delegation in JavaJava中的自动委托
【发布时间】:2017-04-07 07:23:31
【问题描述】:

我想为将在运行时生成的对象添加一些功能。但是,这个对象的接口非常大(并且不在我的控制之下)。我想将对象包装在我自己的类中,它添加了我想要的功能并将标准接口功能委托给原始对象 - 有没有办法在 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
}

【问题讨论】:

    标签: java delegates


    【解决方案1】:

    听起来您需要 dynamic proxy 并仅拦截您想要覆盖的方法。

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

    (我的重点)

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

    【讨论】:

    • +1,正是我会使用的。有关一些代码示例,请参阅我的回答 here
    • 谢谢,这就是我要找的。布赖恩,你的例子也很有用!
    • 是否可以有编译时代理?
    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 2021-08-29
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    相关资源
    最近更新 更多