繁体   English   中英

动态代理和已检查的异常

[英]Dynamic proxy and checked exceptions

如何让我的动态代理抛出检查异常?

我需要一个接口的透明包装器,它有时会抛出已检查的异常,例如IOException 没有第三方AOP或编写我自己的代理是否可能? 手动修改界面的所有20种方法也不是一种选择。

正如康拉德上面提到的那样,你可能正在寻找的是:

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    try {
        Object value = method.invoke(delegate, args);
        return value;
    }
    catch (InvocationTargetException ex) {
        throw ex.getCause();
    }
}

资料来源: https//web.archive.org/web/20120130204437/http : //benpryor.com/blog/2006/08/15/java-dynamic-proxies-and-invocationtargetexception/

您可以使用动态代理。 只要已检查的异常是接口的一部分,您就可以从调用处理程序中抛出已检查的异常。 否则这是非法的,并将创建一个UndeclaredThrowableException,它包装抛出的已检查异常。

interface A{
    void x() throws IOException;
}

A proxy = (A) newProxyInstance(classLoader, new Class<?>[]{A.class}, 
  new InvocationHandler() {      
        @Override
        public Object invoke(Object arg0, Method arg1, Object[] arg2) 
            throws Throwable {
            throw new IOException();
        }
   }
);
proxy.x();

输出:

Exception in thread "main" java.io.IOException
at X$1.invoke(X.java:19)
at $Proxy0.x(Unknown Source)
at X.main(X.java:22)

对于接口A,未声明的已检查异常:

interface A{
    void x();
}

Exception in thread "main" java.lang.reflect.UndeclaredThrowableException
  at $Proxy0.x(Unknown Source)
  at X.main(X.java:22)
Caused by: java.io.IOException
  at X$1.invoke(X.java:19)
  ... 2 more

如果在它所代理的接口的方法的签名中声明了异常,则动态代理可以抛出已检查的异常。 从Sun的动态代理参考

如果invoke方法抛出异常,则代理实例上的方法调用也会抛出异常。

异常的类型必须可分配给在接口方法的签名中声明的任何异常类型,或者分配给未经检查的异常类型java.lang.RuntimeExceptionjava.lang.Error

如果通过调用抛出已检查的异常,该异常不能分配给接口方法的throws子句中声明的任何异常类型,则代理实例上的方法调用将抛出UndeclaredThrowableException 将使用invoke方法抛出的异常构造UndeclaredThrowableException

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM