2013-05-06 55 views
6

我有一個遺留類C1,實現接口I,可能會拋出一些異常。創建一個類的異常安全包裝器

我想創建一個C2類,也實現基於C1實例的接口I,但捕獲所有異常並對它們做一些有用的事情。

目前我的實現是這樣的:

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塊。

有沒有辦法在這裏減少代碼重複量?

+0

你想要的方式「包裝」從界面是純粹的或有額外的呢?因爲你沒有清楚,因爲你正在重寫示例中的一些包可見方法。 – 2013-05-06 06:07:54

+0

如果您想爲C2提供普通的Java源代碼,請不要使用它。 – 2013-05-06 06:12:34

+0

@Java Mentor它有什麼不同? – 2013-05-06 07:39:38

回答

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(); 
    } 
}