用于扩展实例的Java体系结构问题(需要模式推荐)

Whi*_*cal 0 java inheritance design-patterns dynamic extend

我不允许修改外部API的服务

  MyClass instance = ServiceUtil.getThing();
Run Code Online (Sandbox Code Playgroud)

我想扩展这个返回的类和添加/覆盖一个方法,但留下其他人,比如150个方法.

  private class MyWrapperClass extends MyClass(){
      public MyWrapperClass(){super();}
      @Override public String toString(){ return "Blocked toString"; }
  }
Run Code Online (Sandbox Code Playgroud)

有没有办法从返回的MyClass实例强制这个"强制转换"到我新的特定子类型?

注意:请不要建议制作构造函数的方法,传递原始对象并且必须复制并实现150个方法来调用包装对象

hel*_*ios 7

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

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

就像是:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:您仍然必须创建此代理实现:

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
Run Code Online (Sandbox Code Playgroud)


And*_*s_D 5

我希望我能帮到你:你有一个

MyClass instance = ServiceUtil.getThing();
Run Code Online (Sandbox Code Playgroud)

但是想要类似的东西

MyWrapperClass instance = (MyWrapperClass) ServiceUtil.getThing();
Run Code Online (Sandbox Code Playgroud)

(这显然不起作用,即使MyWrapperClass延伸MyClass).

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