動的プロキシにチェック済み例外をスローさせるにはどうすればよいですか?
.などのチェックされた例外をスローすることがあるインターフェイスの透過ラッパーが必要IOException
です。サードパーティのAOPがなくても、または独自のプロキシを作成しなくても可能ですか?インターフェイスの20のメソッドすべてを手動で変更することもオプションではありません。
動的プロキシにチェック済み例外をスローさせるにはどうすればよいですか?
.などのチェックされた例外をスローすることがあるインターフェイスの透過ラッパーが必要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();
}
}
動的プロキシを使用できます。チェックされた例外がインターフェースの一部である限り、呼び出しハンドラーからチェックされた例外をスローできます。それ以外の場合、これは不正であり、スローされたチェック済み例外をラップする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.RuntimeException
またはのいずれかに割り当て可能である必要がありますjava.lang.Error
。チェックされた例外が、インターフェイスメソッドのthrows句で宣言された例外タイプのいずれにも割り当てられないinvokeによって
UndeclaredThrowableException
スローされた場合、プロキシインスタンスのメソッド呼び出しによってスローされます。はUndeclaredThrowableException
、invokeメソッドによってスローされた例外を除いて作成されます。