2013-05-06 56 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(); 
    } 
}