10

動的プロキシにチェック済み例外をスローさせるにはどうすればよいですか?

.などのチェックされた例外をスローすることがあるインターフェイスの透過ラッパーが必要IOExceptionです。サードパーティのAOPがなくても、または独自のプロキシを作成しなくても可能ですか?インターフェイスの20のメソッドすべてを手動で変更することもオプションではありません。

4

3 に答える 3

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/

于 2012-05-23T12:09:59.387 に答える
11

動的プロキシを使用できます。チェックされた例外がインターフェースの一部である限り、呼び出しハンドラーからチェックされた例外をスローできます。それ以外の場合、これは不正であり、スローされたチェック済み例外をラップする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
于 2010-09-15T06:55:19.883 に答える
2

動的プロキシは、プロキシしているインターフェイスのメソッドのシグニチャで例外が宣言されている場合、チェックされた例外をスローできます。Sunのダイナミックプロキシリファレンスから:

invokeメソッドによって例外がスローされた場合、プロキシインスタンスのメソッド呼び出しによっても例外がスローされます。

例外のタイプは、インターフェイスメソッドのシグニチャで宣言された例外タイプのいずれか、またはチェックされていない例外タイプjava.lang.RuntimeExceptionまたはのいずれかに割り当て可能である必要がありますjava.lang.Error

チェックされた例外が、インターフェイスメソッドのthrows句で宣言された例外タイプのいずれにも割り当てられないinvokeによってUndeclaredThrowableExceptionスローされた場合、プロキシインスタンスのメソッド呼び出しによってスローされます。はUndeclaredThrowableException、invokeメソッドによってスローされた例外を除いて作成されます。

于 2010-09-15T07:02:57.073 に答える