首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于扩展实例的Java架构问题(需要模式推荐)

用于扩展实例的Java架构问题(需要模式推荐)
EN

Stack Overflow用户
提问于 2012-08-16 17:21:41
回答 3查看 677关注 0票数 0

来自外部API的服务返回给我,但我不能修改

代码语言:javascript
复制
  MyClass instance = ServiceUtil.getThing();

我想扩展这个返回的类,并添加/覆盖一个方法,但保留其他方法,比如150个方法。

代码语言:javascript
复制
  private class MyWrapperClass extends MyClass(){
      public MyWrapperClass(){super();}
      @Override public String toString(){ return "Blocked toString"; }
  }

有没有办法强制这种从返回的MyClass实例到我新创建的特定子类型的“转换”?

注意:请不要建议使用构造函数、传递原始对象以及必须复制和实现150个方法来调用包装对象的方法

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-16 17:30:45

如果MyClass是一个接口,请查看java.lang.reflect.Proxyjava.lang.reflect.InvocationHandler

您可以实现始终执行相同操作的动态代理。它是,始终将控制权传递给您的原始实现...方法X被调用时除外。

类似于:

代码语言:javascript
复制
class MyHandler implements InvocationHandler {
  Object invoke(Object proxy, Method method, Object[] args) {
    if (method is the one you want to change) {
       do whatever
    else
       return method.invoke(originalObject, args);
  }
}

注意:无论如何您都必须创建此代理实现:

代码语言:javascript
复制
MyClass original = ServiceUtil.getThing();
MyClass proxy = (MyClass) Proxy.newProxyInstance(
                                          MyClass.class.getClassLoader(), // classloader to use
                                          new Class[] { MyClass.class }, // interfaces to implement
                                          new MyHandler()); // who does the dirty work when methods are invoked
票数 7
EN

Stack Overflow用户

发布于 2012-08-16 17:44:48

我希望我没弄错:你有一个

代码语言:javascript
复制
MyClass instance = ServiceUtil.getThing();

但是想要这样的东西

代码语言:javascript
复制
MyWrapperClass instance = (MyWrapperClass) ServiceUtil.getThing();

(这显然不起作用,即使MyWrapperClass扩展了MyClass)。

解决方案是基于MyClass创建一个新的MyWrapperClass实例,很抱歉地说,使用构造函数是一种很好的方法(public MyWrapperClass(MyClass myClass))。

票数 5
EN

Stack Overflow用户

发布于 2012-08-16 17:26:06

请不要建议这样的方法:创建构造函数,传递原始对象,然后必须复制和实现150个方法来调用包装的对象

你的意思是说“装饰”不是你想看的选项,对吧?

但是如果MyClass是一种接口类型,你必须定义那150多个方法,将149个方法调用委托给被修饰的方法并覆盖那个方法,那么修饰对你来说就是一个问题。

如果MyClass是一个类类型,那么您不需要编写这149个方法,对吧?还是我完全误会你了?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11984165

复制
相关文章

相似问题

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