gpt4 book ai didi

java - 创建类的异常安全包装器

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:33:06 25 4
gpt4 key购买 nike

我有一个遗留类 C1,它实现了接口(interface) I,它可能会抛出一些异常。

我想创建一个 C2 类,它也实现接口(interface) 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。这对当前问题无关紧要)。

接口(interface)包含很多函数,所以我不得不一次又一次地编写相同的 try...catch block 。

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

最佳答案

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

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

关于java - 创建类的异常安全包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16392755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com