5

UPDATEソリューションは、呼び出しから別のプロキシを返す Java.lang.reflect.Proxy であり、割り当て時に ClassCastException が発生します

私のテスト コード プロキシjava.sql.Connection.

次のようにプロキシを作成します。

log.info("connection is "+connection.getClass().getName()+", "+
    (connection instanceof Connection));
Object proxy = java.lang.reflect.Proxy.newProxyInstance(
    connection.getClass().getClassLoader(),
    connection.getClass().getInterfaces(),
    new MockFailureWrapper(connection));
log.info("proxy is "+proxy.getClass().getName()+", "+
    (proxy instanceof Connection));
return (Connection)proxy;

H2 DB 接続をラップすると、これは完全に機能します。

MySQL 接続をラップしようとすると、ラップのタイプがであっても、返されるプロキシのキャストがConnection失敗します。例外は次のとおりです。connectionConnection

java.lang.ClassCastException: $Proxy11 cannot be cast to java.sql.Connection

H2 接続のログ行は次のとおりです。

connection is org.h2.jdbc.JdbcConnection, true
proxy is $Proxy9, true

また、MySQL 接続の場合:

connection is com.mysql.jdbc.JDBC4Connection, true
proxy is $Proxy11, false

何が起こっているのですか? MySQL DB 接続をラップできないのはなぜですか?

4

1 に答える 1

1

問題は次の行です。

connection.getClass().getInterfaces()

プロキシしたいクラスによって直接実装されているインターフェースを提供するだけです。Connection-interface が実装されている場合。MySql-Connection クラスのスーパークラス (AbstractConnection としましょう) によって、プロキシは Connection インターフェースを実装しません。

これを修正するには、プロキシが実装するインターフェイスの配列に Connection-Interface を追加します。

于 2012-11-27T01:27:03.610 に答える