-
急求 使用代理出现类型转换异常!!! 25
具体代码如下,异常出现在getConnection方法中Connection conn2 = (Connection)Proxy.newProxyInstance(conn.getClass().getClassLoader(),conn.getClass().getInterfaces(),this);
异常内容:Exception in thread "main" java.lang.ClassCastException: $Proxy0
at com.think.Handler.bind(Handler.java:24)
at com.think.TestProxy.main(TestProxy.java:9)
代码:
package tutorial.DBUtil;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.SQLException;
public class _Connection implements InvocationHandler {
private final String CLOSE_METHOD_NAME = "close";
private Connection conn = null;
private boolean inUse = false; //数据库的忙状态
private long lastAccessTime = System.currentTimeMillis();//用户最后一次访问该连接方法的时间
_Connection(Connection conn,boolean inUse)
{
this.conn = conn;
this.inUse = inUse;
}
/**
* Returns the conn.
* @return Connection
*/
public Connection getConnection()
{
//返回数据库连接conn的接管类,以便截住close方法
Connection conn2 = (Connection)Proxy.newProxyInstance(
conn.getClass().getClassLoader(),
conn.getClass().getInterfaces(),this);
return conn2;
}
/**
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object)
*/
public Object invoke(Object proxy,Method m,Object[] args)
{
Object obj = null;
if(CLOSE_METHOD_NAME.equals(m.getName()))
{
setInUse(false);
}else{
try {
m.invoke(conn, args);
////设置最后一次访问时间,以便及时清除超时的连接
lastAccessTime = System.currentTimeMillis();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return obj;
}
/**
* 该方法真正的关闭了数据库的连接
* @throws SQLException
*/
public void close() throws SQLException
{
//由于类属性conn是没有被接管的连接,因此一旦调用close方法后就直接关闭连接
conn.close();
}
/**
* Returns the inUse.
* @return boolean
*/
public boolean isInUse() {
return inUse;
}
/**
* Returns the lastAccessTime.
* @return long
*/
public long getLastAccessTime() {
return lastAccessTime;
}
/**
* Sets the inUse.
* @param inUse The inUse to set
*/
public void setInUse(boolean inUse) {
this.inUse = inUse;
}
}
问题补充:
public static void main(String[] args) throws Exception {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url = "jdbc:microsoft:sqlserver://localhost:1433;databasename=Test";
Connection conn = DriverManager.getConnection(url, "sa", "123456");
// Connection con = getConnection();
_Connection _con = new _Connection(conn,true);
Connection cs = _con.getConnection();
PreparedStatement ps = cs.prepareStatement("select * from testuser");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.print(rs.getString(1) + "\n");
System.out.print(rs.getString(2) + "\n");
}
cs.close();
}
其他的除了 obj = m.invoke(conn,args);修改外都一样。既然楼下测试没有问题,我想是否是我的环境中少些东西。当我不用代理时候,一切连接正常。当调用Connection cs = _con.getConnection();就会报异常,Debug 时候在Thread.dispatchUncaughtExcetpion(Throwable) line:not available 页中显示Source not found.
问题补充:
根据楼下的要求 我贴出了main方法,问题还是存在2008年7月21日 20:40
4个答案 按时间排序 按投票排序
-
修改方法: [我没有测, 你试下]
public Connection getConnection() { //返回数据库连接conn的接管类,以便截住close方法 Connection conn2 = (Connection)Proxy.newProxyInstance( conn.getClass().getClassLoader(), Connection.class,this); // 这里改下.. conn.getClass().getInterfaces() return conn2; }
public classs com.microsoft.sqlserver.jdbc.SQLServerConnection implements java.sql.Connection, java.io.Serializable public calss com.mysql.jdbc.Connection extends com.mysql.jdbc.ConnectionProperties implements java.sql.Connection
他们的区别在于SQLServerConnection多实现了一个接口.
2008年7月22日 14:42
-
我的测试main()
public static void main(String[] args) throws Exception { Class.forName("com.mysql.jdbc.Driver").newInstance(); String url = "jdbc:mysql://localhost/iwoo?useUnicode=true&characterEncoding=utf8"; Connection conn = DriverManager.getConnection(url, "root", null); _Connection _connection = new _Connection(conn, true); Connection proxyConn = _connection.getConnection(); Statement s = proxyConn.createStatement(); ResultSet r = s.executeQuery("select * from CODEMSTR"); while (r.next()) { System.out.println(r.getString("CODE_ID")); } proxyConn.close(); }
2008年7月21日 23:54
-
你没有把你的main()贴出来.
public Object invoke(Object proxy, Method m, Object[] args) { Object obj = null; if (CLOSE_METHOD_NAME.equals(m.getName())) { setInUse(false); } else { try { // obj = 这里被我修改过了 obj = m.invoke(conn, args); ////设置最后一次访问时间,以便及时清除超时的连接 lastAccessTime = System.currentTimeMillis(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } return obj; }
2008年7月21日 23:53
相关推荐
急求学生会监察部工作计划!.doc
我现在需要一个想阿里巴巴右边那个效果的代码,希望高手给一些指导和资料。谢谢了!效果可访问http://www.alibaba.com
我做的个网站有个页面在进去的时候鼠标事件有错误,但如果是在第二页,鼠标事件又没有错误,请高手指点
王同《新品卖翻天》:急求成——这种产品呀,起量太慢!.doc
独立版360断网急求箱,不用安装360安全卫士,可独立运行 断网修复工具
急求医疗废物管理整改报告.doc
全国自考《急求护理学》试题及答案.docx
供急求authorware作品的人参考!
急求一个VB密码输入的验证程序编写代码.txt
急求IBATIS是什么,它的核心,优点,缺点和用时要注意什么_百度知道,急求IBATIS是什么,它的核心,优点,缺点和用时要注意什么_百度知道急求IBATIS是什么,它的核心,优点,缺点和用时要注意什么_百度知道
急求以自己的角度写一篇院学生会秘书处的工作计划….doc
急求lorenz系统的追踪控制的matlab源程序-单向耦合网络连接的Lorenz系统的追踪控制.pdf 单向耦合网络连接的Lorenz系统的追踪控制.pdf 论文
新手求教MATLAB中遗传算法的指导论文需要急求-单交叉口交通多目标控制方法.pdf 我的论文跟附件中的文章类似,但编程不大懂,希望各位大神帮忙看看指导一下
MFC下的OpenGL,绘图完成了但是旋转实在不会,初学,老师没教马上要考试了,求帮助啊,谢谢大神们了
Xeterm桌面版是兼容eterm...还有更多行业内部人员急求的新功能,如:工作组管理、多账号同时登录、国内舱位运价显示快速中文转换航班内容报价、实时记录预定编码及状态,一键提取、记事本、先进的四则运算计算器等等。
基于MSP430F149的时钟程序。main disp timer C语言实现
驱动路径的要求我看文档一般用相对路径简单点,假设我的驱动文件放在当前测试代码项目的上一级目录,那我可以直接#define DRIVER_PATH "..\filem.sys",我的测试代码如下,急求各位大侠帮忙!!
JIRA-5.1.1-language-pack-zh_CN
该Demo是用Unity原生的录音系统来实现聊天语音室,语音识别,语音合成; 原生的录音存在这录音时间固定,内存大小固定的问题,该工程解决录音以上的问题,可以将音频保存本地,或者服务器上面,目前功能已经...急求分数
360 快速急救包 直接安裝即可 快速掃毒 修復漏洞