6

我有一个遗留类 C1,实现接口 I,可能会引发一些异常。

我想创建一个类 C2,也实现接口 I,它基于 C1 的实例,但捕获所有异常并对它们做一些有用的事情。

目前我的实现如下所示:

class C2 implements I {
    C1 base;

    @Override void func1() {
      try {
         base.func1();
      } catch (Exception e) {
         doSomething(e);
      }
    }

    @Override void func2() {
      try {
         base.func2();
      } catch (Exception e) {
         doSomething(e);
      }
    }

    ...

}

(注意:我也可以让 C2 扩展 C1。这对当前问题无关紧要)。

该接口包含许多功能,所以我不得不一次又一次地编写相同的 try...catch 块。

有没有办法减少这里的代码重复量?

4

1 回答 1

1

你可以做一个代理,它实际上可以是通用的

interface I1 {
    void test();
}

class C1 implements I1 {
    public void test() {
        System.out.println("test");
        throw new RuntimeException();
    }
}

class ExceptionHandler implements InvocationHandler {
    Object obj;

    ExceptionHandler(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        try {
            return method.invoke(obj, args);
        } catch (Exception e) {
            // need a workaround for primitive return types
            return null;
        }
    }

    static <T> T proxyFor(Object obj, Class<T> i) {
        return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(), new Class[] { i },
                new ExceptionHandler(obj));
    }
}

public class Test2 {

    public static void main(String[] args) throws Exception {
        I1 i1 = ExceptionHandler.proxyFor(new C1(), I1.class);
        i1.test();
    }
}
于 2013-05-06T06:19:44.607 回答