代碼如下:
Connection proxy = (Connection) Proxy.newProxyInstance(Connection.class.getClassLoader(), Connection.class.getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if ("close".equals(method.getName())) { returnConn(conn); return null; } else { return method.invoke(conn, args); } } });
在使用動態代理增強Connection連接對象的close方法時,我碰到了如題所示的異常。通過搜索我發現這個異常出現的原因在於我使用的mysql數據庫驅動的問題,由於數據庫驅動不同,Connection.class.getInterfaces()返回的結果也不同,它返回的是一個Class[]數組,然而此數組的第一個元素必須是Connection才能把創建的代理類轉為Connection對象,否則就會報錯。
所以這里我們可以采取一個替代方式替換Connection.class.getInterfaces(),即new Class[] { Connection.class },這樣無論數據庫驅動是什么版本的驅動,都能保證這個類型轉換不出錯。